Java集合框架是Java编程中用于存储和操作一组数据的工具,它提供了丰富的接口和实现类,以支持不同类型的数据结构需求。
一、集合框架概述
Java集合框架(Java Collections Framework, JCF)是一套系统类库,用于统一管理对象的存储、查询和操作。其核心特点包括统一的接口设计、高效的实现类以及灵活的数据结构支持。在Java 2之前,已有特设类如Vector、Stack等,但集合框架通过标准化接口(如Collection、Map)进一步提升了代码的可复用性和一致性。
二、主要集合类型
集合框架主要分为两大类:单列集合(Collection)和双列集合(Map)。其中,Collection接口是所有单列集合的根接口,其子接口包括List、Set和Queue:
- List:有序且可重复的集合,常见实现类有ArrayList和Vector。ArrayList基于数组实现,查询快但增删慢,线程不安全;Vector与ArrayList类似,但线程安全,效率较低。
- Set:无序且不可重复的集合,如HashSet和TreeSet,适用于需要唯一性约束的场景。
- Queue:队列结构,支持先进先出(FIFO)操作,常用于任务调度等场景。
Java集合框架主要围绕两大根接口展开:Collection
和 Map
。
1. Collection 接口(单列集合)
Collection
是所有单列集合的父接口,定义了集合的基本操作,如添加、删除、遍历等。它有三个主要子接口:
接口 | 特点 | 常见实现类 |
---|---|---|
List | 有序、可重复 | ArrayList, LinkedList, Vector |
Set | 无序、不可重复 | HashSet, TreeSet, LinkedHashSet |
Queue | 队列(先进先出) | PriorityQueue, LinkedList |
2. Map 接口(双列集合)
Map
用于存储"键值对"映射,每个键唯一,值可重复。
实现类 | 特点 |
---|---|
HashMap | 基于哈希表,无序,线程不安全 |
TreeMap | 基于红黑树,按自然顺序或自定义排序 |
LinkedHashMap | 保持插入顺序 |
Hashtable | 线程安全,但性能较差 |
ConcurrentHashMap | 线程安全,高并发性能好 |
三、常用集合实现类详解
1. ArrayList
-
底层数据结构:动态数组
-
特点 :
- 查询快(O(1))
- 增删慢(需移动元素)
- 非线程安全
-
适用场景:频繁查询、较少增删
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
System.out.println(list.get(0)); // 输出: Java
2. LinkedList
-
底层数据结构:双向链表
-
特点 :
- 增删快(O(1))
- 查询慢(需遍历)
- 实现了 Queue 接口,可作为队列使用
-
适用场景:频繁增删
List<String> list = new LinkedList<>();
list.add("A");
list.add("B");
list.remove(0);
3. HashSet
-
底层数据结构:哈希表(基于 HashMap)
-
特点 :
- 无序
- 元素唯一
- 非线程安全
-
适用场景:需要去重、不关心顺序
Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("apple"); // 重复,不会添加
4. TreeSet
-
底层数据结构:红黑树
-
特点 :
- 有序(自然排序或自定义排序)
- 元素唯一
-
适用场景:需要排序、去重
Set<String> set = new TreeSet<>();
set.add("Orange");
set.add("Apple");
System.out.println(set); // 输出: [Apple, Orange]
5. HashMap
-
底层数据结构:数组 + 链表/红黑树(JDK8后)
-
特点 :
- 键唯一,值可重复
- 无序
- 非线程安全
-
适用场景:高效存取键值对
Map<String, Integer> map = new HashMap<>();
map.put("张三", 18);
map.put("李四", 20);
System.out.println(map.get("张三")); // 输出: 18
四、集合的线程安全机制
Java集合中大部分实现类是非线程安全的,如 ArrayList
、HashMap
。在多线程环境下,可采用以下方式保证线程安全:
方式 | 示例 |
---|---|
使用同步包装类 | List<String> list = Collections.synchronizedList(new ArrayList<>()); |
使用并发集合类 | ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>(); |
使用 CopyOnWriteArrayList |
List<String> list = new CopyOnWriteArrayList<>(); |
五、集合遍历方式
1. for 循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
2. 增强 for 循环(foreach)
for (String item : list) {
System.out.println(item);
}
3. Iterator 迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
六、与数组的区别
集合与数组的主要差异体现在:
- 数据类型:数组只能存储相同类型元素,而集合可以存储不同类型(通过泛型可约束类型)。
- 灵活性:数组长度固定,集合长度动态可变;集合还提供了更丰富的操作方法(如排序、查找等)。
七、应用场景
集合框架广泛应用于数据管理、算法实现等场景。例如,ArrayList适合频繁查询的场景,而LinkedList更适合频繁增删的场景;Map接口(如HashMap)则用于键值对存储。
八、总结
集合类型 | 推荐使用场景 |
---|---|
ArrayList | 查询多、增删少 |
LinkedList | 增删多、查询少 |
HashSet | 去重、不关心顺序 |
TreeSet | 去重、需要排序 |
HashMap | 键值对存储、无序 |
LinkedHashMap | 键值对存储、需保持插入顺序 |
ConcurrentHashMap | 多线程环境下的键值对存储 |