一.集合框架
Java集合框架(Java Collections Framework)是Java标准库中用于存储和处理对象集合的一组接口和实现类。它提供了一套统一的API,使得开发者能够高效地管理和操作数据集合。以下是关于Java集合框架的详细介绍,包括其核心接口、常用实现类、特点以及使用场景。
1. Java集合框架的结构
Java集合框架主要由以下几部分组成:

1.1 核心接口
-
Collection
:集合的顶层接口,定义了集合的基本操作,如添加、删除、遍历等。-
List
:有序集合,允许重复元素,可以按索引访问元素。-
ArrayList
:基于动态数组实现,支持快速随机访问,但插入和删除效率较低。 -
LinkedList
:基于双向链表实现,插入和删除效率高,但随机访问效率较低。 -
Vector
:线程安全的动态数组,与ArrayList
类似,但性能稍差。
-
-
Set
:无序集合,不允许重复元素。-
HashSet
:基于哈希表实现,提供快速的查找、插入和删除操作。 -
TreeSet
:基于红黑树实现,元素自然排序或通过比较器排序。 -
LinkedHashSet
:基于哈希表和链表实现,保持元素插入顺序。
-
-
Queue
:队列接口,用于实现先进先出(FIFO)的数据结构。-
LinkedList
:实现Queue
接口,支持队列操作。 -
PriorityQueue
:基于优先级堆实现,元素按优先级顺序出队。
-
-
-
Map
:键值对集合,键唯一,值可以重复。-
HashMap
:基于哈希表实现,提供快速的查找、插入和删除操作。 -
TreeMap
:基于红黑树实现,按键自然排序或通过比较器排序。 -
LinkedHashMap
:基于哈希表和链表实现,保持元素插入顺序或访问顺序。
-
1.2 工具类
-
Collections
:提供静态方法操作或返回集合,如排序、查找、同步等。 -
Arrays
:提供静态方法操作数组,如排序、搜索等。
2. 常用集合类的特点及使用场景
2.1 ArrayList
-
特点:
-
基于动态数组实现,支持快速随机访问。
-
插入和删除操作效率较低,因为需要移动元素。
-
线程不安全。
-
-
使用场景:
-
需要频繁访问元素,且插入和删除操作较少时。
-
示例:
List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); System.out.println(list.get(0)); // 输出 1
-
2.2 LinkedList
-
特点:
-
基于双向链表实现,插入和删除操作效率高。
-
随机访问效率较低,需要遍历链表。
-
线程不安全。
-
-
使用场景:
-
需要频繁插入和删除元素,且随机访问较少时。
-
示例:
j
List<Integer> list = new LinkedList<>(); list.add(1); list.add(2); list.addFirst(0); // 在头部插入元素 System.out.println(list.get(0)); // 输出 0
-
2.3 HashSet
-
特点:
-
基于哈希表实现,提供快速的查找、插入和删除操作。
-
不允许重复元素,无序。
-
-
使用场景:
-
需要快速查找和去重时。
-
示例:
Set<Integer> set = new HashSet<>(); set.add(1); set.add(2); set.add(1); // 重复元素不会被添加 System.out.println(set.size()); // 输出 2
-
2.4 TreeSet
-
特点:
-
基于红黑树实现,元素自然排序或通过比较器排序。
-
不允许重复元素。
-
-
使用场景:
-
需要对元素进行排序时。
-
示例:
Set<Integer> set = new TreeSet<>(); set.add(3); set.add(1); set.add(2); System.out.println(set); // 输出 [1, 2, 3]
-
2.5 HashMap
-
特点:
-
基于哈希表实现,提供快速的查找、插入和删除操作。
-
键唯一,值可以重复。
-
-
使用场景:
-
需要快速查找键值对时。
-
示例:
Map<String, Integer> map = new HashMap<>(); map.put("one", 1); map.put("two", 2); System.out.println(map.get("one")); // 输出 1
-
2.6 TreeMap
-
特点:
-
基于红黑树实现,按键自然排序或通过比较器排序。
-
键唯一,值可以重复。
-
-
使用场景:
-
需要按键排序的键值对时。
-
示例:
Map<String, Integer> map = new TreeMap<>(); map.put("two", 2); map.put("one", 1); map.put("three", 3); System.out.println(map); // 输出 {one=1, three=3, two=2}
-
3. 集合的遍历
3.1 使用for-each
循环
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
for (Integer num : list) {
System.out.println(num);
}
3.2 使用Iterator
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer num = iterator.next();
System.out.println(num);
}
3.3 使用Stream
(Java 8及以上)
list.stream().forEach(System.out::println);
4. 集合的线程安全
4.1 线程安全的集合类
-
Vector
:线程安全的动态数组,但性能较差。 -
Stack
:线程安全的栈,继承自Vector
。 -
Hashtable
:线程安全的哈希表,但性能较差。
4.2 使用Collections
工具类
-
同步包装器:
List<Integer> list = Collections.synchronizedList(new ArrayList<>()); Map<String, Integer> map = Collections.synchronizedMap(new HashMap<>());
4.3 使用Concurrent
包
-
ConcurrentHashMap
:线程安全的哈希表,性能优于Hashtable
。 -
CopyOnWriteArrayList
:线程安全的动态数组,适用于读多写少的场景。 -
BlockingQueue
:线程安全的队列,支持阻塞操作。
5. 总结
Java集合框架提供了丰富多样的集合类,适用于不同的应用场景。选择合适的集合类可以显著提高代码的性能和可维护性。以下是选择集合类时的一些关键点:
-
性能:根据操作频率(如插入、删除、查找)选择合适的集合类。
-
线程安全:根据是否多线程操作选择线程安全的集合类。
-
顺序:根据是否需要保持元素顺序选择合适的集合类。