List、Set、Map三者之间的关系

发布于:2025-07-05 ⋅ 阅读:(18) ⋅ 点赞:(0)

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排序

网站公告

今日签到

点亮在社区的每一天
去签到