------------------------------------------------------------------------------------------------------
Java 中的集合框架(java.util 包下)包含众多用于存储和操作对象的容器类,主要分为 Collection 和 Map 两大体系,此外还有一些特殊用途的集合类。以下是常见集合对象的分类及核心特点:
-
ArrayList
- 底层基于动态数组实现,查询快(随机访问)、增删慢(需移动元素)。
- 初始容量 10,扩容机制为
oldCapacity + (oldCapacity >> 1)(1.5 倍)。
- 线程不安全,适合单线程场景。
-
LinkedList
- 底层基于双向链表实现,增删快(只需修改指针)、查询慢(需遍历)。
- 同时实现了
Deque 接口,可作为队列 / 栈使用。
- 线程不安全。
-
Vector
- 底层同 ArrayList(动态数组),但线程安全(方法加
synchronized),性能较差。
- 扩容机制为默认翻倍(可指定增量),已被 ArrayList 替代,不推荐使用。
-
Stack
- 继承自 Vector,基于数组实现的栈(后进先出),线程安全但性能差,推荐用
Deque 的 push/pop 替代。
-
HashSet
- 底层基于 HashMap 实现(元素存于 HashMap 的 key 中),无序,查询 / 增删效率高(O (1))。
- 依赖元素的
hashCode() 和 equals() 保证唯一性,线程不安全。
-
LinkedHashSet
- 继承自 HashSet,底层用 LinkedHashMap 实现,维护插入顺序(通过链表记录元素顺序)。
- 性能略低于 HashSet,适合需要顺序的场景。
-
TreeSet
- 底层基于 红黑树 实现,元素自动排序(自然排序或自定义
Comparator)。
- 查询 / 增删效率为 O (log n),线程不安全。
-
ArrayDeque
- 基于循环数组实现的双端队列(
Deque),可作为栈或队列使用,效率高于 LinkedList。
- 无容量限制(自动扩容),线程不安全。
-
LinkedList
- 同时实现
Deque 接口,可作为双端队列,增删灵活但查询效率低。
-
PriorityQueue
- 基于小顶堆实现的优先级队列,元素按优先级排序(自然排序或
Comparator),非 FIFO。
- 线程不安全,不允许 null 元素。
-
ConcurrentLinkedQueue
- 线程安全的无界队列,基于链表实现,适合高并发场景(CAS 操作保证安全)。
-
HashMap
- 底层基于数组 + 链表 / 红黑树实现(JDK 8+ 当链表长度 > 8 时转红黑树),无序。
- Key 允许 null(仅一个),Value 允许 null,线程不安全,查询 / 增删效率高(O (1))。
- 初始容量 16,负载因子 0.75,扩容为翻倍。
-
LinkedHashMap
- 继承自 HashMap,底层多了双向链表维护键值对的插入顺序或访问顺序(可用于 LRU 缓存)。
- 性能略低于 HashMap,线程不安全。
-
TreeMap
- 底层基于红黑树实现,Key 自动排序(自然排序或
Comparator)。
- Key 不允许 null,查询 / 增删效率 O (log n),线程不安全。
-
Hashtable
- 古老的哈希表实现,线程安全(方法加
synchronized),但性能差。
- Key 和 Value 均不允许 null,已被
ConcurrentHashMap 替代。
-
ConcurrentHashMap
- 线程安全的哈希表,JDK 7 基于分段锁,JDK 8+ 基于 CAS + synchronized 实现,并发性能优异。
- 支持高并发读写,Key 和 Value 不允许 null。
-
WeakHashMap
- Key 为弱引用,当 Key 不再被强引用时,会被 GC 回收,适合缓存场景(如临时数据)。
-
Collections 工具类
Collections.singletonList():不可变单元素 List。
Collections.emptyList():空集合(不可变)。
Collections.synchronizedList(List):包装为线程安全的 List(同理可包装 Set/Map)。
-
枚举集合
EnumSet:专为枚举类型设计的 Set,底层基于位向量,效率极高。
EnumMap:Key 为枚举类型的 Map,底层数组实现,查询快。
- List:
Collections.synchronizedList(new ArrayList<>())、CopyOnWriteArrayList(写时复制,适合读多写少)。
- Set:
Collections.synchronizedSet(new HashSet<>())、CopyOnWriteArraySet。
- Map:
ConcurrentHashMap、Collections.synchronizedMap(new HashMap<>())。
- Queue:
ConcurrentLinkedQueue、LinkedBlockingQueue(阻塞队列)、ArrayBlockingQueue(有界阻塞队列)。
选择集合时需关注:是否有序、是否允许重复、线程安全性、增删查效率等,根据场景匹配最合适的实现类。
------------------------------------------------------------------------------------------------------
Java 集合框架的继承关系以 Collection 和 Map 为两大根接口,衍生出众多实现类。以下是核心继承关系图(简化版,突出常用类):
Iterable (迭代器接口,所有集合的顶层接口)
↓
Collection (单值集合根接口)
↓
┌───────────┬────────────┬─────────────┐
│ │ │ │
List Set Queue (三大子接口)
│ │ │
│ │ ├─────────────┬─────────────┐
│ │ │ │ │
│ │ Deque BlockingQueue │
│ │ │ │ │
│ │ ArrayDeque LinkedBlockingQueue
│ │ ArrayBlockingQueue
│ │
│ ├────────────┬─────────────┬─────────────┐
│ │ │ │ │
│ HashSet LinkedHashSet TreeSet EnumSet
│
├───────────┬────────────┬─────────────┐
│ │ │ │
ArrayList LinkedList Vector Stack(已过时)
│
CopyOnWriteArrayList(线程安全)
Map (键值对集合根接口)
↓
┌───────────┬────────────┬─────────────┬─────────────┐
│ │ │ │ │
HashMap LinkedHashMap TreeMap Hashtable WeakHashMap
│ │
│ Properties(继承自Hashtable,用于配置文件)
│
ConcurrentHashMap(线程安全)
│
EnumMap(键为枚举类型)
Iterable:所有集合的顶层接口,提供 iterator() 方法,支持增强 for 循环(for-each)。
Collection:单值集合的根接口,定义了增删改查等通用方法(如 add()、remove()、size())。
List:有序、可重复,允许 null(如 ArrayList 基于数组,LinkedList 基于链表)。
Set:无序、不可重复,最多一个 null(如 HashSet 基于 HashMap,TreeSet 基于红黑树排序)。
Queue:队列(FIFO),子接口 Deque 支持双端操作(如 ArrayDeque 可作栈 / 队列)。
Map:键值对集合,键唯一(如 HashMap 线程不安全,ConcurrentHashMap 线程安全)。
通过继承关系可快速理解集合的特性(如 LinkedHashSet 继承 HashSet 并维护顺序,TreeMap 实现排序功能)。
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------