一、单列集合(Collection):元素的容器
Collection 接口是所有单列集合的根接口,它主要分为 List、Set 和 Queue 三大类。
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锁,性能较差。