Java Collections Framework (集合框架) 详解
Java 集合框架 (Java Collections Framework, JCF) 是一套功能强大且灵活的工具,用于存储和处理一组对象。集合框架为各种数据结构提供了标准实现,如列表 (List)、集合 (Set) 和映射 (Map),极大地简化了数据操作任务。
1. 集合框架的结构
Java 集合框架主要包含以下几个核心接口:
- Collection:集合的根接口,包含基本操作和特性,子接口包括
List、Set和Queue。 - Map:映射接口,用于存储键-值对。
集合框架的层次结构
Collection
|
---------------------------------
| | |
List Set Queue
| | |
ArrayList HashSet PriorityQueue
LinkedList LinkedHashSet ArrayDeque
Vector TreeSet
Map
|
--------------------------------
| |
HashMap SortedMap
LinkedHashMap TreeMap
WeakHashMap
IdentityHashMap
2. 主要接口及其实现
2.1 List 接口
List 接口表示一个有序的集合,允许重复元素。List 可以通过索引访问元素。
- 主要实现类:
- ArrayList:
- 基于动态数组,访问速度快,插入和删除效率相对较低。
- 适合随机访问场景。
- LinkedList:
- 基于双向链表,插入和删除效率高,但访问速度较慢。
- 适合频繁插入、删除操作的场景。
- Vector:
- 线程安全的动态数组,类似
ArrayList,但性能较低。
- 线程安全的动态数组,类似
- ArrayList:
示例:
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
System.out.println(list.get(1)); // 输出: B
2.2 Set 接口
Set 接口表示一个无序集合,不允许重复元素。
- 主要实现类:
- HashSet:
- 基于哈希表实现,不保证元素的顺序。
- 插入、删除和查找操作的效率高。
- LinkedHashSet:
- 保持插入顺序的
HashSet,基于链表和哈希表实现。
- 保持插入顺序的
- TreeSet:
- 基于红黑树实现,元素有序,支持排序操作。
- HashSet:
示例:
Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("A"); // 重复元素不会被添加
System.out.println(set); // 输出: [A, B]
2.3 Queue 接口
Queue 接口表示一个队列,通常遵循“先入先出” (FIFO) 原则。
- 主要实现类:
- PriorityQueue:
- 基于优先级堆实现,元素按自然顺序或自定义比较器排序。
- ArrayDeque:
- 双端队列,允许在两端插入和删除元素,效率高于
LinkedList。
- 双端队列,允许在两端插入和删除元素,效率高于
- PriorityQueue:
示例:
Queue<Integer> queue = new LinkedList<>();
queue.offer(1);
queue.offer(2);
queue.poll(); // 移除并返回队首元素
System.out.println(queue); // 输出: [2]
2.4 Map 接口
Map 接口表示一个键值对集合,每个键最多只能映射到一个值。
- 主要实现类:
- HashMap:
- 基于哈希表实现,不保证顺序,允许
null键和值。 - 适合插入、删除和查找操作。
- 基于哈希表实现,不保证顺序,允许
- LinkedHashMap:
- 保持插入顺序的
HashMap,使用链表维护顺序。
- 保持插入顺序的
- TreeMap:
- 基于红黑树实现,键按自然顺序或自定义顺序排序。
- WeakHashMap:
- 使用弱引用的哈希表,便于垃圾回收。
- IdentityHashMap:
- 使用
==比较键的哈希表,而不是equals()方法。
- 使用
- HashMap:
示例:
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
System.out.println(map.get("A")); // 输出: 1
3. 常用方法
3.1 List 接口的方法
add(E e): 添加元素到列表末尾。get(int index): 获取指定索引的元素。remove(int index): 移除指定索引的元素。set(int index, E element): 替换指定索引的元素。size(): 返回列表的大小。
3.2 Set 接口的方法
add(E e): 添加元素,如果已存在,则不添加。remove(Object o): 移除指定元素。contains(Object o): 检查集合是否包含某元素。size(): 返回集合的大小。
3.3 Queue 接口的方法
offer(E e): 添加元素到队列尾部。poll(): 移除并返回队首元素,若队列为空则返回null。peek(): 返回队首元素但不移除,若队列为空则返回null。
3.4 Map 接口的方法
put(K key, V value): 添加键值对。get(Object key): 获取指定键的值。remove(Object key): 移除指定键的键值对。containsKey(Object key): 检查是否包含指定键。keySet(): 返回所有键的集合。values(): 返回所有值的集合。
4. 集合工具类:Collections 和 Arrays
4.1 Collections 类
Collections 是一个工具类,提供了许多静态方法来操作集合,如排序、搜索、同步化等。
Collections.sort(List<T> list): 对列表进行排序。Collections.shuffle(List<?> list): 随机打乱列表中的元素。Collections.max(Collection<? extends T> coll): 返回集合中的最大元素。Collections.min(Collection<? extends T> coll): 返回集合中的最小元素。
示例:
List<Integer> numbers = Arrays.asList(5, 2, 8, 1);
Collections.sort(numbers);
System.out.println(numbers); // 输出: [1, 2, 5, 8]
4.2 Arrays 类
Arrays 类提供了一些方法来操作数组,如排序、搜索、转换为集合等。
Arrays.asList(T... a): 将数组转换为List。Arrays.sort(int[] a): 对数组进行排序。Arrays.binarySearch(int[] a, int key): 使用二分查找法查找元素。
示例:
int[] arr = {5, 2, 8, 1};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // 输出: [1, 2, 5, 8]
5. 线程安全的集合
- 使用
Collections.synchronizedList、synchronizedSet、synchronizedMap:List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
- 使用并发集合类 (在
java.util.concurrent包中):ConcurrentHashMap:线程安全的HashMap。CopyOnWriteArrayList:线程安全的ArrayList。
6. 迭代集合
6.1 使用 Iterator 迭代
Iterator 是一个用于遍历集合的接口,支持 remove() 方法来安全地移除元素。
示例:
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
System.out.println(item);
}
6.2 使用增强型 for 循环
示例:
for (String item : list) {
System.out.println(item);
}
7. 总结与选择指南
List:需要有序集合时使用,选择ArrayList(访问快)或LinkedList(插入、删除快)。Set:需要无序、不重复集合时使用,选择HashSet(无序)或TreeSet(有序)。Queue:需要先进先出的集合时使用,选择LinkedList
或PriorityQueue。Map:需要键值对集合时使用,选择HashMap(无序)或TreeMap(有序)。
Java 集合框架为数据处理提供了丰富的工具,理解各个实现类的特性和用法,能帮助你写出高效、简洁的代码。










