1、数据结构与核心特性
接口 | 数据结构 | 顺序性 | 唯一性 | 键值对 | null 元素 |
---|---|---|---|---|---|
List | 动态数组/链表 | 有序(插入顺序) | 允许重复 | 否 | 允许多个 null |
Set | 哈希表 / 红黑树 | 无序(HashSet)有序(LinkedHashSet/TreeSet) | 不允许重复 | 否 | 仅 HashSet/LinkedHashSet 允许 1 个 null |
Map | 哈希表 / 红黑树 链表长度≥8 时转红黑树 | 无序(HashMap)有序(LinkedHashMap/TreeMap) | 键(Key)唯一 | 是 | 键:HashMap 允许 1 个 null值 |
2、实现类对比
List
- ArrayList:基于动态数组,随机访问快(O (1)),插入 / 删除慢(O (n))。
- LinkedList:基于双向链表,插入 / 删除快(O (1)),随机访问慢(O (n))。
- Vector:线程安全(同步方法),性能低于 ArrayList。
Set - HashSet:基于 HashMap,无序,依赖hashCode()和equals()。
- LinkedHashSet:继承 HashSet,维护插入顺序(或访问顺序)。
- TreeSet:基于 TreeMap,有序(自然排序或自定义 Comparator),不允许 null。
Map - HashMap:线程不安全,允许 null 键 / 值,无序。
- LinkedHashMap:继承 HashMap,维护插入顺序(或访问顺序)。
- TreeMap:基于红黑树,按键排序(自然排序或自定义 Comparator),不允许 null 键。
- ConcurrentHashMap:线程安全(分段锁 / CAS),高并发场景优先选择。
- Hashtable:线程安全(同步方法),不允许 null 键 / 值,性能低。
3、线程安全性
- List:ArrayList/LinkedList 非线程安全,Vector/CopyOnWriteArrayList 线程安全。
- Set:HashSet/TreeSet 非线程安全,CopyOnWriteArraySet/ConcurrentSkipListSet 线程安全。
- Map:HashMap/TreeMap 非线程安全,ConcurrentHashMap/Hashtable 线程安全。
4、适用场景
- List:需要有序、可重复数据,频繁随机访问(如分页查询结果)。
- Set:需要去重、无需顺序(如权限去重),或需要有序且唯一(如排行榜)。
- Map:需要键值对映射(如配置缓存),或需要按键排序(如时间轴数据)。
5、性能优化
- 初始容量:创建集合时预估大小,避免频繁扩容(如new ArrayList<>(100))。
- HashMap 加载因子:默认 0.75,高并发场景可调整以平衡空间和时间。
- TreeSet/TreeMap:插入 / 删除 / 查询时间复杂度 O (log n),适用于需要排序的场景。
6、常见坑点
- Set 去重依赖方法:自定义对象需重写hashCode()和equals()。
- Map 的键不可变:使用自定义对象作为键时,确保其不可变(如 String、Integer)。
- ConcurrentHashMap 迭代器弱一致性:迭代时不抛出ConcurrentModificationException,但可能反映部分修改。
7、源码层面理解
- ArrayList 扩容机制:每次扩容为原容量的 1.5 倍(oldCapacity + (oldCapacity >> 1))。
- HashMap哈希冲突处理:链表 + 红黑树(JDK 8+,链表长度≥8 且容量≥64 时转换为树)。
- TreeSet 排序实现:基于 TreeMap 的NavigableMap接口,通过compareTo()或Comparator排序