Java 集合框架详解

113 阅读3分钟

Java集合框架包含List(ArrayList、LinkedList)、Set(HashSet、TreeSet)、Queue(PriorityQueue)和Map(HashMap、ConcurrentHashMap),通过动态数组、链表、红黑树等数据结构实现,提供线程安全方案如分段锁、CAS及写时复制,适用于高并发与不同访问场景。


一、Java 集合框架类图(Mermaid)

IterableCollection«interface»List+add()+get()+remove()«interface»Set+add()+contains()«interface»Queue+offer()+poll()«interface»Map+put()+get()SortedMapArrayListLinkedListVectorCopyOnWriteArrayListHashSetLinkedHashSetTreeSetCopyOnWriteArraySetPriorityQueueArrayDequeLinkedBlockingQueueHashMapLinkedHashMapTreeMapHashtableConcurrentHashMap

image.png


二、核心接口与实现类

1. List(有序、可重复)
  • 实现类

    • ArrayList:基于动态数组,随机访问快(O(1)),插入删除慢(O(n))。
    • LinkedList:基于双向链表,插入删除快(O(1)),随机访问慢(O(n))。
    • Vector:线程安全的动态数组(同步方法),性能差。
    • CopyOnWriteArrayList:写时复制,线程安全,适合读多写少场景。
  • 线程安全

    • VectorCollections.synchronizedList(new ArrayList<>()) 是同步实现。
    • CopyOnWriteArrayList 通过写时复制实现无锁读。
  • 使用场景

    • 需要快速随机访问 → ArrayList
    • 频繁插入删除 → LinkedList
    • 多线程环境 → CopyOnWriteArrayList 或同步包装类。

2. Set(无序、唯一)
  • 实现类

    • HashSet:基于 HashMap,无序,O(1) 时间操作。
    • LinkedHashSet:维护插入顺序的 HashSet
    • TreeSet:基于红黑树,自然排序,O(log n) 时间操作。
    • CopyOnWriteArraySet:基于 CopyOnWriteArrayList,线程安全。
  • 线程安全

    • CopyOnWriteArraySetCollections.synchronizedSet()
  • 使用场景

    • 去重 → HashSet
    • 需要有序 → TreeSet(排序)或 LinkedHashSet(插入顺序)。

3. Queue(队列)
  • 实现类

    • PriorityQueue:基于堆,优先级队列。
    • ArrayDeque:基于循环数组,双端队列。
    • LinkedBlockingQueue:基于链表,阻塞队列(线程安全)。
  • 线程安全

    • LinkedBlockingQueueArrayBlockingQueue 是线程安全的阻塞队列。
  • 使用场景

    • 任务调度 → PriorityQueue
    • 生产者-消费者模型 → LinkedBlockingQueue

4. Map(键值对)
  • 实现类

    • HashMap:基于哈希表+链表/红黑树(JDK8+),无序。
    • LinkedHashMap:维护插入顺序或访问顺序。
    • TreeMap:基于红黑树,按键排序。
    • Hashtable:线程安全的 HashMap(同步方法)。
    • ConcurrentHashMap:分段锁(JDK7)或 CAS(JDK8+),高并发优化。
  • 线程安全

    • HashtableCollections.synchronizedMap() 是同步实现。
    • ConcurrentHashMap 是高性能线程安全实现。
  • 使用场景

    • 快速键值查找 → HashMap
    • 高并发 → ConcurrentHashMap
    • 需要排序 → TreeMap

三、核心实现原理

集合类数据结构扩容机制线程安全实现方式
ArrayList动态数组默认扩容为 1.5 倍(int newCapacity = oldCapacity + (oldCapacity >> 1)Collections.synchronizedList
LinkedList双向链表无需扩容
HashMap数组+链表/红黑树负载因子(默认 0.75)触发扩容ConcurrentHashMap(分段锁/CAS)
ConcurrentHashMap分段锁(JDK7)或 CAS(JDK8+)分段扩容锁粒度更细
CopyOnWriteArrayList动态数组写时复制新数组无锁读,写操作加锁

四、线程安全方案对比

方案实现方式适用场景缺点
synchronized 方法方法级同步(如 Vector低并发场景性能差(锁竞争)
同步包装类Collections.synchronizedXxx()简单同步需求锁粒度粗
写时复制(COW)CopyOnWriteArrayList读多写少写操作开销大
分段锁(JDK7)ConcurrentHashMap 分段锁高并发读写锁粒度较细
CAS(JDK8+)ConcurrentHashMap 的 CAS高并发且低竞争实现复杂

五、总结

  • 选择依据

    1. 是否线程安全:单线程选非同步类(如 ArrayList),多线程选 ConcurrentHashMapCopyOnWriteArrayList
    2. 访问模式:随机访问 → ArrayList,插入删除 → LinkedList
    3. 排序需求:自然排序 → TreeSet/TreeMap,插入顺序 → LinkedHashSet/LinkedHashMap
    4. 性能与内存ArrayDequeLinkedList 内存更紧凑,HashMap 的负载因子可调整。
  • 最佳实践

    • 避免在循环中直接操作 Collections.synchronizedXxx 集合。
    • 高并发场景优先使用 ConcurrentHashMapCopyOnWriteArrayList