论 JAVA 集合框架中 接口与类的关系
前言
这是笔者在学习过程中的一篇"备忘录",其目的是能用最EZ最粗鄙的语言口述出 JAVA集合框架中 所有类与接口的关系
本人在不断地学习中,总会混淆集合框架中的类和接口,以及它们的作用关系,虽然不影响我的使用,但是我也不想一直糊涂下去,故而趁知识还没混淆之际,赶紧写下来.
这不是一篇看起来很专业的文章,但我希望它是最好懂的.
正文
首先请看图
Java 集合框架包括多个接口,每个接口定义了一类集合的通用操作和行为。主要接口包括:
-
Collection
接口:这是所有集合类的根接口,它定义了一些基本的集合操作方法,如add()
,remove()
,size()
,isEmpty()
等。Collection
接口的主要实现包括Set
,List
, 和Queue
。 -
Set
接口:继承自Collection
,表示一个不允许重复元素的集合。常见实现类有HashSet
,LinkedHashSet
, 和TreeSet
。Set
主要关注元素的唯一性。 -
List
接口:继承自Collection
,表示一个有序的集合,允许重复元素。常见实现类有ArrayList
,LinkedList
, 和Vector
。List
提供按索引访问元素的方法。 -
Map
接口:与Collection
不同,Map
表示键值对的映射关系。常见实现类有HashMap
,TreeMap
, 和LinkedHashMap
。Map
用于存储和管理键值对,其中键是唯一的。
我们知道, 接口可以被看做是一种"行为指导准则". 定义了可以实现的方法
而我们的类,它就是"执行者",类不仅仅负责实现接口定义的方法,还包含了更多关于数据、逻辑和具体功能的实现细节。
结论一
一个类实现了不同的接口,功能也会改变
举例:ArrayList
和 LinkedList
ArrayList
和 LinkedList
是 Java 集合框架中的两个常见类,它们都实现了多个接口,但由于它们的实现方式不同,表现的行为也有差异。
ArrayList
实现的接口:
List
:这是最重要的接口,定义了有序、可重复的元素集合。RandomAccess
:这是一个标识接口,表明该类支持快速的随机访问(按索引访问元素)。Cloneable
:表明该类可以被克隆。Serializable
:表明该类的对象可以被序列化,便于保存到文件或通过网络传输。
LinkedList
实现的接口:
List
:同样实现了List
接口,表明它支持有序集合。Deque
:这是Queue
的子接口,表明LinkedList
可以作为双端队列使用。Cloneable
和Serializable
:和ArrayList
一样,它也可以被克隆和序列化。
List<String> arrayList = new ArrayList<>();
List<String> linkedList = new LinkedList<>();
// ArrayList 随机访问效率高
String arrayElement = arrayList.get(2);
// LinkedList 插入/删除操作效率高
linkedList.addFirst("First Element");
其次,不同类对于接口的实现程度也是有区别的
例如
完全实现:
ArrayList
实现了List
接口,提供了按索引访问和操作元素的方法,并维护元素的顺序。HashSet
实现了Set
接口,确保集合中元素的唯一性,并不维护元素的顺序。HashMap
实现了Map
接口,提供了对键值对的高效存储和检索。
部分实现:
AbstractList
和 AbstractSet
是抽象类,它们提供了 List
和 Set
接口的一部分实现。它们允许子类继承并补充实现。
结论二
一个接口用不同类去实现,效果也会不同
以 Queue 接口举例
有很多类都可以实现 这个接口
以笔者能完全掌握的知识举例
1. LinkedList
实现 Queue
接口
LinkedList
是基于链表的实现,插入和删除元素时效率较高(O(1) 操作),尤其是在队列的头尾操作时。- 它可以作为队列,也可以作为双端队列使用,支持从头部和尾部的操作。
效果:
- 适用于需要频繁插入和删除操作的场景,且元素不需要按顺序排序。
import java.util.LinkedList;
import java.util.Queue;
public class LinkedListQueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
// 添加元素到队列
queue.offer("A");
queue.offer("B");
queue.offer("C");
// 查看队首元素
System.out.println("队首元素: " + queue.peek()); // 输出: A
// 移除队首元素
System.out.println("移除: " + queue.poll()); // 输出: A
// 再次查看队首元素
System.out.println("队首元素: " + queue.peek()); // 输出: B
}
}
2. PriorityQueue
实现 Queue
接口
PriorityQueue
是基于堆的实现,插入元素时按照优先级顺序插入,取出元素时总是取出优先级最高的元素。- 虽然也是队列,但并不保证元素按插入顺序排布,而是按优先级排序。
效果:
- 适用于需要根据优先级处理元素的场景,例如任务调度、事件处理等。
import java.util.PriorityQueue;
import java.util.Queue;
public class PriorityQueueExample {
public static void main(String[] args) {
Queue<Integer> priorityQueue = new PriorityQueue<>();
// 添加元素
priorityQueue.offer(10);
priorityQueue.offer(20);
priorityQueue.offer(15);
// 移除优先级最高的元素(最小元素)
System.out.println("移除: " + priorityQueue.poll()); // 输出: 10
System.out.println("队首元素: " + priorityQueue.peek()); // 输出: 15
}
}
3. ArrayDeque
实现 Queue
接口
ArrayDeque
是基于动态数组的双端队列,既可以作为栈使用,也可以作为队列使用,插入和删除操作效率较高(O(1))。- 它不允许
null
元素,并且容量可以动态调整。
import java.util.ArrayDeque;
import java.util.Queue;
public class ArrayDequeExample {
public static void main(String[] args) {
Queue<String> arrayDeque = new ArrayDeque<>();
// 添加元素
arrayDeque.offer("A");
arrayDeque.offer("B");
arrayDeque.offer("C");
// 查看和移除队首元素
System.out.println("队首元素: " + arrayDeque.peek()); // 输出: A
System.out.println("移除: " + arrayDeque.poll()); // 输出: A
System.out.println("队首元素: " + arrayDeque.peek()); // 输出: B
}
}
所以说
- LinkedList:适合频繁插入和删除的场景;
- PriorityQueue:适合按优先级排序的场景;
- ArrayDeque:适合队列和栈操作场景。
结尾
这些大部分都是JAVASE的基础知识,笔者今天只是捋一捋,防止未来的自己又忘记这些基础知识了,如果有问题,请各位斧正.