Java 的集合框架(Java Collections Framework,JCF)是一组用于存储和操作数据的接口、实现类和算法。它提供了高效的数据结构和算法,简化了开发者的工作。Java 集合框架的核心接口和类都位于 java.util
包中。
1. 集合框架的核心接口
Java 集合框架的核心接口包括:
Collection
:所有集合类的根接口,定义了基本的集合操作(如添加、删除、遍历)。- 子接口:
List
:有序且允许重复元素的集合。Set
:无序且不允许重复元素的集合。Queue
:队列,支持先进先出(FIFO)操作。
- 子接口:
Map
:存储键值对(Key-Value Pair),键不允许重复。
2. 常用集合类
以下是 Java 集合框架中常用的实现类:
(1) List
接口的实现类
ArrayList
:- 基于动态数组实现。
- 支持快速随机访问,但插入和删除效率较低。
- 示例:
List<String> list = new ArrayList<>(); list.add("Java"); list.add("Python"); System.out.println(list.get(0)); // 输出: Java
LinkedList
:- 基于双向链表实现。
- 插入和删除效率高,但随机访问效率低。
- 示例:
List<String> list = new LinkedList<>(); list.add("Java"); list.add("Python"); System.out.println(list.get(1)); // 输出: Python
Vector
:- 线程安全的动态数组。
- 性能较低,通常被
ArrayList
取代。
(2) Set
接口的实现类
HashSet
:- 基于哈希表实现。
- 无序且不允许重复元素。
- 示例:
Set<String> set = new HashSet<>(); set.add("Java"); set.add("Python"); set.add("Java"); // 重复元素不会被添加 System.out.println(set); // 输出: [Java, Python]
LinkedHashSet
:- 基于哈希表和链表实现。
- 保留插入顺序。
TreeSet
:- 基于红黑树实现。
- 元素按自然顺序或自定义顺序排序。
- 示例:
Set<String> set = new TreeSet<>(); set.add("Java"); set.add("Python"); System.out.println(set); // 输出: [Java, Python](按字母顺序排序)
(3) Queue
接口的实现类
LinkedList
:- 可以用作队列或双端队列(Deque)。
PriorityQueue
:- 基于优先级堆实现。
- 元素按优先级排序。
- 示例:
Queue<Integer> queue = new PriorityQueue<>(); queue.add(5); queue.add(1); queue.add(3); System.out.println(queue.poll()); // 输出: 1(优先级最高)
(4) Map
接口的实现类
HashMap
:- 基于哈希表实现。
- 键值对无序,允许
null
键和null
值。 - 示例:
Map<String, Integer> map = new HashMap<>(); map.put("Java", 1); map.put("Python", 2); System.out.println(map.get("Java")); // 输出: 1
LinkedHashMap
:- 保留插入顺序或访问顺序。
TreeMap
:- 基于红黑树实现。
- 键按自然顺序或自定义顺序排序。
- 示例:
Map<String, Integer> map = new TreeMap<>(); map.put("Java", 1); map.put("Python", 2); System.out.println(map); // 输出: {Java=1, Python=2}(按字母顺序排序)
Hashtable
:- 线程安全的哈希表。
- 性能较低,通常被
HashMap
取代。
3. 集合框架的工具类
Collections
:- 提供静态方法用于操作集合(如排序、查找、反转)。
- 示例:
List<Integer> list = new ArrayList<>(); list.add(3); list.add(1); list.add(2); Collections.sort(list); System.out.println(list); // 输出: [1, 2, 3]
Arrays
:- 提供静态方法用于操作数组(如排序、查找)。
- 示例:
int[] array = {3, 1, 2}; Arrays.sort(array); System.out.println(Arrays.toString(array)); // 输出: [1, 2, 3]
4. 集合框架的遍历
Iterator
:- 用于遍历集合。
- 示例:
List<String> list = new ArrayList<>(); list.add("Java"); list.add("Python"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); }
- 增强 for 循环:
- 示例:
for (String item : list) { System.out.println(item); }
- 示例:
forEach
方法:- 示例:
list.forEach(item -> System.out.println(item));
- 示例:
5. 集合框架的线程安全
Vector
和Hashtable
:- 线程安全,但性能较低。
Collections.synchronizedList
:- 将非线程安全的集合转换为线程安全的集合。
- 示例:
List<String> list = Collections.synchronizedList(new ArrayList<>());
ConcurrentHashMap
:- 高效的线程安全哈希表。
CopyOnWriteArrayList
:- 线程安全的
List
,适用于读多写少的场景。
- 线程安全的
6. 集合框架的性能对比
集合类 | 数据结构 | 插入/删除性能 | 随机访问性能 | 是否有序 | 是否允许重复 |
---|---|---|---|---|---|
ArrayList | 动态数组 | 低 | 高 | 是 | 是 |
LinkedList | 双向链表 | 高 | 低 | 是 | 是 |
HashSet | 哈希表 | 高 | - | 否 | 否 |
TreeSet | 红黑树 | 中 | - | 是 | 否 |
HashMap | 哈希表 | 高 | - | 否 | 键不重复 |
TreeMap | 红黑树 | 中 | - | 是 | 键不重复 |
总结
Java 集合框架提供了丰富的数据结构和算法,能够满足大多数开发需求。通过合理选择集合类,可以显著提高程序的性能和可维护性。掌握集合框架的核心接口、实现类及其特性,是 Java 开发者的必备技能。