以下是Java集合类的分类及简要介绍,按照接口层级组织:
一、Collection 接口
1. List(有序、可重复)
-
ArrayList
- 基于动态数组,支持快速随机访问(O(1))
- 线程不安全,默认初始容量10,扩容系数1.5
- 适用场景:频繁查询、较少增删
-
LinkedList
- 基于双向链表,插入/删除高效(O(1)),随机访问慢(O(n))
- 实现了Deque接口,可用作队列或栈
- 适用场景:频繁增删、实现队列操作
-
Vector
- 线程安全的动态数组(方法使用synchronized修饰)
- 性能较差,已被
Collections.synchronizedList
或CopyOnWriteArrayList
取代
-
CopyOnWriteArrayList(JUC包)
- 写时复制技术实现线程安全,读操作无锁
- 适用场景:读多写极少(如监听器列表)
2. Set(无序、元素唯一)
-
HashSet
- 基于HashMap实现,元素通过哈希值存储
- 允许null值,不保证顺序
- 适用场景:快速去重
-
LinkedHashSet
- 继承HashSet,通过双向链表维护插入顺序
- 迭代顺序可预测
- 适用场景:需维护插入顺序的去重需求
-
TreeSet
- 基于TreeMap实现,元素按自然顺序或Comparator排序
- 操作时间复杂度O(log n)
- 适用场景:需要有序集合
-
CopyOnWriteArraySet(JUC包)
- 基于CopyOnWriteArrayList实现,线程安全
- 适用场景:读多写少的并发去重需求
3. Queue(队列)
-
LinkedList
- 实现了Deque接口,支持双端队列操作
- 非线程安全
-
PriorityQueue
- 基于堆结构实现,元素按优先级排序
- 不允许null值,默认自然排序或自定义Comparator
-
ArrayDeque
- 基于循环数组实现的高效双端队列
- 性能优于LinkedList,适用于栈和队列操作
-
BlockingQueue(JUC包)
- 线程安全阻塞队列,实现类包括:
- ArrayBlockingQueue:有界数组实现
- LinkedBlockingQueue:可选有界链表实现
- PriorityBlockingQueue:支持优先级的无界队列
- 适用场景:生产者-消费者模型
- 线程安全阻塞队列,实现类包括:
二、Map 接口(键值对)
1. 通用实现
-
HashMap
- 基于哈希表(数组+链表/红黑树,JDK8+)
- 允许null键/值,非线程安全
- 适用场景:快速存取键值对
-
LinkedHashMap
- 维护插入顺序或访问顺序(LRU实现基础)
- 内部通过双向链表记录顺序
-
TreeMap
- 基于红黑树实现,键按自然顺序或Comparator排序
- 适用场景:需要有序键值对的场景
-
Hashtable
- 线程安全的哈希表(方法使用synchronized修饰)
- 过时类,建议用
ConcurrentHashMap
替代
2. 并发实现(JUC包)
-
ConcurrentHashMap
- 分段锁(JDK7)或CAS+synchronized(JDK8+)实现高并发
- 支持高并发读写,性能优于Hashtable
-
ConcurrentSkipListMap
- 基于跳表实现的有序并发Map
- 适用场景:高并发有序键值对需求
三、工具类
-
Collections
- 提供同步包装方法:
synchronizedList()
,synchronizedSet()
- 生成不可变集合:
unmodifiableList()
,unmodifiableMap()
- 提供同步包装方法:
-
Arrays
- 数组工具类,提供
asList()
、排序/搜索方法
- 数组工具类,提供
四、选择策略
-
是否需要线程安全?
- 是:使用
ConcurrentHashMap
、CopyOnWriteArrayList
- 否:默认选择
HashMap
、ArrayList
- 是:使用
-
是否需要排序?
- 是:
TreeMap
、TreeSet
- 否:
HashMap
、HashSet
- 是:
-
插入/删除 vs 随机访问
- 频繁增删:
LinkedList
- 频繁查询:
ArrayList
- 频繁增删:
五、示例场景
- 缓存实现:
LinkedHashMap
(LRU淘汰策略) - 高并发计数:
ConcurrentHashMap
的compute()
方法 - 事件监听器:
CopyOnWriteArrayList
(避免遍历时修改异常)
通过理解不同集合类的底层实现与特性,能够根据具体业务场景选择最合适的数据结构,从而优化性能与资源使用。