Java 集合体系详解
Java 集合框架(Java Collections Framework)是Java中用于存储和操作数据集合的一组接口和类。它提供了一套标准化的方法来处理对象集合,使得开发者可以专注于业务逻辑而不是数据结构的实现。
一、集合框架概述
Java集合框架主要由以下几个部分组成:
- 接口(Interfaces): 定义集合的基本操作
- 实现类(Implementations): 接口的具体实现
- 算法(Algorithms): 提供搜索、排序等通用操作
二、核心接口层次结构
Iterable (接口)
└── Collection (接口)
├── List (接口)
├── Set (接口)
│ └── SortedSet (接口)
└── Queue (接口)
└── Deque (接口)
Map (接口)
└── SortedMap (接口)
三、主要集合接口详解
- Collection 接口
所有集合类的根接口,定义了集合的基本操作:
java
public interface Collection<E> extends Iterable<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
<T> T[] toArray(T[] a);
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
boolean retainAll(Collection<?> c);
void clear();
// Java 8 新增的默认方法
default boolean removeIf(Predicate<? super E> filter) { ... }
default Spliterator<E> spliterator() { ... }
default Stream<E> stream() { ... }
default Stream<E> parallelStream() { ... }
}
- List 接口
有序集合(序列),允许重复元素:
- 精确控制每个元素的插入位置
- 可以通过索引访问元素
- 可以搜索元素
主要实现类:
ArrayList
: 基于动态数组LinkedList
: 基于双向链表Vector
: 线程安全的动态数组(已过时)Stack
: 后进先出(LIFO)堆栈(继承自Vector)
- Set 接口
不允许重复元素的集合:
- 不保证顺序(除非是SortedSet)
- 最多包含一个null元素
主要实现类:
HashSet
: 基于哈希表LinkedHashSet
: 保持插入顺序的HashSetTreeSet
: 基于红黑树的SortedSet实现
- Queue 接口
用于在处理前保存元素的集合:
- 通常但不一定按FIFO(先进先出)原则排序
- 优先级队列按提供的比较器或元素的自然顺序排序
主要实现类:
PriorityQueue
: 优先级队列ArrayDeque
: 基于数组的双端队列LinkedList
: 也实现了Deque接口
- Map 接口
键值对映射,不继承Collection接口:
- 键唯一,值可以重复
- 每个键最多映射到一个值
主要实现类:
HashMap
: 基于哈希表LinkedHashMap
: 保持插入顺序的HashMapTreeMap
: 基于红黑树的SortedMap实现Hashtable
: 线程安全的Map实现(已过时)ConcurrentHashMap
: 线程安全的HashMap替代
四、主要集合实现类比较
- List实现类比较
特性 | ArrayList | LinkedList | Vector |
---|---|---|---|
底层结构 | 动态数组 | 双向链表 | 动态数组 |
线程安全 | 不安全 | 不安全 | 安全 |
随机访问 | O(1) | O(n) | O(1) |
插入/删除(首尾) | O(n) | O(1) | O(n) |
内存占用 | 较小 | 较大 | 较大 |
- Set实现类比较
特性 | HashSet | LinkedHashSet | TreeSet |
---|---|---|---|
底层结构 | 哈希表 | 哈希表+链表 | 红黑树 |
排序 | 无 | 插入顺序 | 自然/比较器顺序 |
操作时间复杂度 | O(1) | O(1) | O(log n) |
允许null | 是 | 是 | 否 |
- Map实现类比较
特性 | HashMap | LinkedHashMap | TreeMap | Hashtable |
---|---|---|---|---|
底层结构 | 哈希表 | 哈希表+链表 | 红黑树 | 哈希表 |
排序 | 无 | 插入/访问顺序 | 键排序 | 无 |
线程安全 | 不安全 | 不安全 | 不安全 | 安全 |
允许null键/值 | 是/是 | 是/是 | 否/是 | 否/否 |
性能 | 高 | 较高 | 中等 | 低 |
五、并发集合
Java还提供了一组线程安全的集合类:
CopyOnWriteArrayList
: 线程安全的List实现CopyOnWriteArraySet
: 线程安全的Set实现ConcurrentHashMap
: 线程安全的HashMap实现ConcurrentSkipListMap
: 线程安全的SortedMap实现ConcurrentSkipListSet
: 线程安全的SortedSet实现BlockingQueue
接口及其实现类(如ArrayBlockingQueue
、LinkedBlockingQueue
等)
六、集合工具类:Collections
java.util.Collections
类提供了许多静态方法,用于操作或返回集合:
- 排序:
sort()
,shuffle()
- 搜索:
binarySearch()
- 同步包装:
synchronizedCollection()
,synchronizedList()
等 - 不可修改包装:
unmodifiableCollection()
,unmodifiableList()
等 - 单元素集合:
singleton()
,singletonList()
,singletonMap()
- 空集合:
emptyList()
,emptySet()
,emptyMap()
七、Java 8+ 对集合的增强
-
Stream API: 提供函数式操作集合的能力
javalist.stream().filter(x -> x > 5).map(String::valueOf).collect(Collectors.toList());
-
默认方法: 在接口中添加新方法而不破坏现有实现
javadefault void forEach(Consumer<? super T> action) default boolean removeIf(Predicate<? super E> filter)
-
新的集合工厂方法 (Java 9+)
javaList<String> list = List.of("a", "b", "c"); Set<String> set = Set.of("a", "b", "c"); Map<String, Integer> map = Map.of("a", 1, "b", 2);
八、最佳实践
-
根据需求选择合适的集合类型:
- 需要键值对 → Map
- 允许重复且有序 → List
- 不允许重复 → Set
- 需要排序 → TreeSet/TreeMap
- 需要保持插入顺序 → LinkedHashSet/LinkedHashMap
-
预估集合大小时,初始化时指定容量以避免频繁扩容
-
在多线程环境下使用并发集合或同步包装
-
优先使用接口类型声明集合变量:
javaList<String> list = new ArrayList<>(); // 好 ArrayList<String> list = new ArrayList<>(); // 不好
-
使用泛型确保类型安全
-
遍历集合时,考虑使用迭代器或for-each循环
Java集合框架强大而灵活,理解其设计原理和各个实现类的特点,能够帮助开发者编写出更高效、更健壮的代码。