一、List 接口及其实现类
-
List
接口特点:List
是一个有序的集合,可以包含重复的元素。用户可以通过整数索引访问元素,类似于数组,但具有动态大小和更多的功能。
-
ArrayList
:- 实现原理:基于动态数组实现。提供快速的随机访问,但在插入和删除元素时可能需要移动大量元素,效率相对较低。
- 用法:
- 创建:
ArrayList<String> list = new ArrayList<>();
- 添加元素:
list.add("element");
- 获取元素:
String element = list.get(index);
- 遍历:可以使用迭代器、增强型 for 循环等。例如:
for (String s : list) {...}
- 创建:
-
LinkedList
:- 实现原理:基于双向链表实现。在插入和删除元素时效率较高,但随机访问相对较慢。
- 用法:
- 创建:
LinkedList<String> linkedList = new LinkedList<>();
- 除了具有和
ArrayList
类似的添加、获取元素的方法外,还可以用作栈或队列。 - 作为栈:
push("element");
(入栈),pop();
(出栈)。 - 作为队列:
offer("element");
(入队),poll();
(出队)。
- 创建:
二、Set 接口及其实现类
-
Set
接口特点:Set
是一个不包含重复元素的集合。
-
HashSet
:- 实现原理:使用哈希表来存储元素,提供快速的添加、删除和查找操作。元素的顺序是不确定的。
- 用法:
- 创建:
HashSet<String> hashSet = new HashSet<>();
- 添加元素:
hashSet.add("element");
- 由于不允许重复元素,如果尝试添加已存在的元素,
add
方法会返回false
。
- 创建:
-
LinkedHashSet
:- 实现原理:维护了元素的插入顺序,同时不允许重复元素。
- 用法:与
HashSet
类似,但在遍历集合时会按照元素的插入顺序进行。
-
TreeSet
:- 实现原理:基于红黑树实现,元素按照自然顺序或指定的比较器进行排序。
- 用法:
- 创建:
TreeSet<String> treeSet = new TreeSet<>();
- 添加元素:
treeSet.add("element");
- 如果元素的类实现了
Comparable
接口,元素将按照自然顺序排序。如果没有,可以提供一个自定义的比较器实现Comparator
接口来进行排序。
- 创建:
三、Queue 接口及其实现类(虽然 Queue
不是直接从 Collection
继承,但通常在集合框架中讨论)
-
Queue
接口特点:- 队列是一种特殊的集合,遵循先进先出(FIFO)的原则。
-
LinkedList
(可作为队列使用):- 用法:
- 创建:
Queue<String> queue = new LinkedList<>();
- 添加元素(入队):
queue.offer("element");
- 获取并移除队首元素(出队):
queue.poll();
- 查看队首元素但不移除:
queue.peek();
- 创建:
- 用法:
-
PriorityQueue
:- 实现原理:基于优先级堆实现。元素按照优先级顺序出队,而不是先进先出的顺序。
- 用法:
- 创建:
PriorityQueue<String> priorityQueue = new PriorityQueue<>();
- 添加元素:
priorityQueue.add("element");
- 取出优先级最高的元素:
priorityQueue.poll();
- 如果元素的类实现了
Comparable
接口,优先级将按照自然顺序确定。如果没有,可以提供一个自定义的比较器实现Comparator
接口来确定优先级。
- 创建:
四、Map 接口及其实现类
Map
不是直接从Collection
接口继承而来,但在 Java 集合框架中,Map
也是非常重要的一部分,通常与Collection
一起讨论。
-
Map
接口特点:Map
是一个存储键值对的集合。每个键在Map
中必须是唯一的,而值可以重复。它提供了根据键来存储、检索和删除值的方法
-
HashMap
:- 实现原理:使用哈希表来存储键值对,提供快速的添加、删除和查找操作。键的顺序是不确定的。
- 用法:
- 创建:
HashMap<String, Integer> hashMap = new HashMap<>();
- 添加键值对:
hashMap.put("key", value);
- 获取值:
Integer value = hashMap.get("key");
- 遍历键集:
for (String key : hashMap.keySet()) {...}
- 遍历值集:
for (Integer value : hashMap.values()) {...}
- 遍历键值对集:
for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {...}
- 创建:
-
LinkedHashMap
:- 实现原理:维护了键值对的插入顺序,同时提供快速的查找操作。
- 用法与
HashMap
类似,但在遍历集合时会按照键值对的插入顺序进行。
-
TreeMap
:- 实现原理:基于红黑树实现,键按照自然顺序或指定的比较器进行排序。
- 用法:
- 创建:
TreeMap<String, Integer> treeMap = new TreeMap<>();
- 添加键值对、获取值、遍历等操作与其他
Map
实现类类似。如果键的类实现了Comparable
接口,键将按照自然顺序排序。如果没有,可以提供一个自定义的比较器实现Comparator
接口来进行排序。
- 创建:
总之,Java 集合框架提供了丰富的集合类型,每种类型都有其特定的实现原理和适用场景。在实际编程中,根据具体的需求选择合适的集合类可以提高程序的效率和可读性。