Java集合框架:核心容器的底层机制与选型指南

165 阅读2分钟

一、单列集合(Collection):元素的容器

Collection 接口是所有单列集合的根接口,它主要分为 ListSetQueue 三大类。

1. List:有序、可重复的动态数组

  • ArrayList:底层是动态数组。由于内存是连续的,所以随机访问get(index))非常快。但插入和删除需要移动元素,性能较差。适用于频繁查询、少量增删的场景。
  • LinkedList:底层是双向链表插入和删除只需修改指针,性能极佳。但随机访问需要遍历链表,性能较差。适用于频繁增删的场景。
  • Vector:线程安全的 ArrayList,但性能较差,已过时。

2. Set:无序、不重复的集合

  • HashSet:底层是**HashMap**。通过哈希算法实现去重,性能最高。元素是无序的。
  • LinkedHashSet:底层是 HashSet双向链表的结合。在去重的同时,保留了元素的插入顺序。
  • TreeSet:底层是红黑树。能够对元素进行自动排序,但性能略低于 HashSet。适用于需要排序和去重的场景。

3. Queue:先进先出的队列

  • LinkedList:可以作为普通队列使用。
  • PriorityQueue:优先级队列,底层是。能够根据元素的优先级进行排序。

二、双列集合(Map):键值对的哈希表

Map 接口用于存储键值对。

1. HashMap:无序、快速查找的哈希表

  • 底层JDK 8 之后,底层是数组 + 链表 + 红黑树
  • 核心:通过哈希算法将键映射到数组索引,实现了 O(1) 的平均查找效率。
  • 特点:键值对是无序的,键和值都可以为 null

2. LinkedHashMap:有序的哈希表

  • 底层:在 HashMap 的基础上,额外维护了一个双向链表

  • 特点

    • 插入顺序排序(默认)。
    • 可配置为按访问顺序排序,这使其成为实现 LRU 缓存的绝佳选择。

3. TreeMap:可排序的红黑树

  • 底层红黑树
  • 特点:键值对按键的自然顺序或自定义比较器进行排序。

三、线程安全集合:高并发的保障

  • ConcurrentHashMap:线程安全的 HashMap,其底层采用了分段锁机制,在高并发下性能优秀。
  • CopyOnWriteArrayList:线程安全的 List,其写操作时会创建一个新的数组。适用于读多写少的场景。
  • Collections.synchronizedList() :通过包装类实现,其所有方法都加了 synchronized 锁,性能较差。