Java 的集合都有哪些,都有什么特点?
hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶
面试资料大全|各种技术资料-2000G
一、集合框架总体结构
二、主要接口分类
1. Collection 接口(单列集合)
(1) List 接口(有序、可重复)
-
ArrayList:
- 基于动态数组
- 随机访问快(O(1))
- 增删慢(需要移动元素)
- 线程不安全
- 默认初始容量10,扩容1.5倍
-
LinkedList:
- 基于双向链表
- 增删快(O(1))
- 随机访问慢(O(n))
- 实现了Deque接口,可作为队列使用
-
Vector:
- 线程安全的ArrayList(方法同步)
- 性能较差
- 默认扩容2倍
-
Stack(已过时):
- 继承自Vector
- LIFO(后进先出)结构
(2) Set 接口(无序、唯一)
-
HashSet:
- 基于HashMap实现
- 元素无序
- 允许null值
- 基本操作时间复杂度O(1)
-
LinkedHashSet:
- 继承HashSet
- 维护插入顺序的链表
- 迭代性能更好
-
TreeSet:
- 基于TreeMap(红黑树)
- 元素自然排序或自定义排序
- 基本操作时间复杂度O(log n)
(3) Queue 接口(队列)
-
PriorityQueue:
- 基于优先级堆
- 元素按自然顺序或Comparator排序
- 不允许null值
-
ArrayDeque:
- 基于可扩容循环数组
- 双端队列实现
- 比LinkedList更高效
2. Map 接口(双列集合,键值对)
-
HashMap:
- 数组+链表+红黑树(JDK8)
- 允许null键和null值
- 非线程安全
- 默认负载因子0.75
-
LinkedHashMap:
- 继承HashMap
- 维护插入顺序或访问顺序
- 适合实现LRU缓存
-
TreeMap:
- 基于红黑树
- 键自然排序或自定义排序
- 基本操作时间复杂度O(log n)
-
Hashtable:
- 线程安全的Map实现
- 方法同步,性能较差
- 不允许null键和null值
-
ConcurrentHashMap:
- 线程安全的HashMap
- JDK8采用CAS+synchronized
- 高并发性能好
三、各集合类对比
List 实现类对比
特性 | ArrayList | LinkedList | Vector |
---|---|---|---|
底层结构 | 动态数组 | 双向链表 | 动态数组 |
随机访问 | 快(O(1)) | 慢(O(n)) | 快(O(1)) |
增删效率 | 慢(O(n)) | 快(O(1)) | 慢(O(n)) |
线程安全 | 不安全 | 不安全 | 安全(synchronized) |
扩容 | 1.5倍 | 无需扩容 | 2倍 |
Set 实现类对比
特性 | HashSet | LinkedHashSet | TreeSet |
---|---|---|---|
底层实现 | HashMap | LinkedHashMap | TreeMap |
元素顺序 | 无序 | 插入顺序 | 排序顺序 |
null值 | 允许 | 允许 | 不允许(取决于Comparator) |
时间复杂度 | O(1) | O(1) | O(log n) |
Map 实现类对比
特性 | HashMap | LinkedHashMap | TreeMap | Hashtable | ConcurrentHashMap |
---|---|---|---|---|---|
底层结构 | 数组+链表+红黑树 | 同上+双向链表 | 红黑树 | 数组+链表 | 数组+链表+红黑树 |
顺序 | 无序 | 插入/访问顺序 | 键排序 | 无序 | 无序 |
null键值 | 允许 | 允许 | 键不能为null | 不允许 | 不允许 |
线程安全 | 不安全 | 不安全 | 不安全 | 安全(synchronized) | 安全(CAS+synchronized) |
锁粒度 | - | - | - | 整个表 | 桶级别 |
四、线程安全集合方案
-
传统线程安全集合
- Vector
- Hashtable
- Stack
-
Collections工具类包装
List<String> syncList = Collections.synchronizedList(new ArrayList<>()); Map<String, String> syncMap = Collections.synchronizedMap(new HashMap<>());
-
JUC并发集合(推荐)
ConcurrentHashMap
CopyOnWriteArrayList
CopyOnWriteArraySet
ConcurrentLinkedQueue
ConcurrentSkipListMap
ConcurrentSkipListSet
五、选择集合的最佳实践
-
单列集合选择:
- 需要快速随机访问 →
ArrayList
- 频繁增删 →
LinkedList
- 需要去重 →
HashSet
- 需要有序去重 →
LinkedHashSet
或TreeSet
- 需要排序 →
TreeSet
- 需要快速随机访问 →
-
键值对集合选择:
- 一般用途 →
HashMap
- 需要保持插入顺序 →
LinkedHashMap
- 需要键排序 →
TreeMap
- 高并发环境 →
ConcurrentHashMap
- 一般用途 →
-
队列选择:
- 一般队列 →
LinkedList
或ArrayDeque
- 优先级队列 →
PriorityQueue
- 高并发队列 →
ConcurrentLinkedQueue
- 一般队列 →
六、Java 8 对集合的增强
-
Stream API:
list.stream().filter(s -> s.startsWith("A")).collect(Collectors.toList());
-
forEach方法:
map.forEach((k, v) -> System.out.println(k + ": " + v));
-
Map新方法:
map.computeIfAbsent(key, k -> new ArrayList<>()).add(value); map.getOrDefault(key, defaultValue); map.merge(key, value, (oldVal, newVal) -> oldVal + newVal);
-
性能优化:
- HashMap链表长度>8时转为红黑树
- ConcurrentHashMap放弃分段锁,改用CAS+synchronized