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 集合框架为数据处理提供了丰富的工具,理解各个实现类的特性和用法,能帮助你写出高效、简洁的代码。