外观
Java 集合的整个体系和继承关系
⭐ 题目日期:
美团 - 2024/12/23
📝 题解:
Java 集合体系与继承关系详解
Java 集合框架(Java Collections Framework,JCF)是Java中用于存储和操作数据组的核心工具,包含丰富的接口和实现类。其核心分为 单列集合(Collection) 和 键值对集合(Map) 两大分支,以下是完整的体系结构和继承关系:
一、Collection 接口(单列集合)
存储单个元素,分为三大子接口:List、Set、Queue。
1. List 接口(有序,可重复)
• 特点:元素按插入顺序排列,允许重复。 • 实现类: • ArrayList:基于动态数组,查询快(O(1)),增删慢(需移动元素)。 • LinkedList:基于双向链表,增删快(O(1)),查询慢(O(n))。 • Vector(过时):线程安全的动态数组,性能差,建议用 Collections.synchronizedList 或 CopyOnWriteArrayList 替代。 • Stack(过时):继承自 Vector,实现栈结构(LIFO)。
2. Set 接口(无序,不可重复)
• 特点:元素唯一,不保证顺序。 • 实现类: • HashSet:基于哈希表,插入/查询快(O(1)),无序。 • LinkedHashSet:在 HashSet 基础上维护插入顺序的双向链表。 • TreeSet:基于红黑树,元素按自然顺序或自定义比较器排序(O(log n))。
3. Queue 接口(队列)
• 特点:先进先出(FIFO)或其他特定顺序。 • 实现类: • LinkedList:同时实现 Deque(双端队列),支持两端操作。 • PriorityQueue:基于堆的优先级队列,元素按优先级排序。 • ArrayDeque:基于循环数组的双端队列,高效实现栈和队列。
二、Map 接口(键值对集合)
存储键值对(Key-Value),键唯一,值可重复。
1. 非线程安全实现
• HashMap:基于哈希表,允许 null 键/值,无序。 • LinkedHashMap:在 HashMap 基础上维护插入顺序或访问顺序(LRU缓存)。 • TreeMap:基于红黑树,键按自然顺序或自定义比较器排序(O(log n))。 • IdentityHashMap:使用 == 比较键的哈希表,适用于特殊场景。 • WeakHashMap:键为弱引用,GC回收键时自动删除条目(适合缓存)。
2. 线程安全实现
• Hashtable(过时):线程安全的哈希表,性能差,建议用 ConcurrentHashMap 替代。 • ConcurrentHashMap:分段锁(JDK7)或 CAS + synchronized(JDK8+)实现高并发。 • ConcurrentSkipListMap:基于跳表,支持并发有序访问。
三、工具类与扩展集合
1. 工具类
• Collections:提供集合排序、同步化、不可变包装等方法。 • synchronizedList(List<T> list):将集合转为线程安全版本。 • unmodifiableList(List<? extends T> list):返回不可变集合。
2. 并发集合(java.util.concurrent)
• CopyOnWriteArrayList:写时复制的线程安全 List,适合读多写少场景。 • BlockingQueue:阻塞队列接口,实现类包括 ArrayBlockingQueue、LinkedBlockingQueue 等。 • ConcurrentLinkedQueue:基于 CAS 的无界非阻塞队列。
3. 其他特殊集合
• EnumSet:专为枚举类型设计的高效集合。 • BitSet:位向量,用于高效存储布尔值数组。
四、继承关系与实现层次
Collection 接口继承树
Collection
├── List
│ ├── ArrayList
│ ├── LinkedList
│ └── Vector → Stack
├── Set
│ ├── HashSet → LinkedHashSet
│ └── TreeSet
└── Queue
├── LinkedList
├── PriorityQueue
└── Deque → ArrayDequeMap 接口继承树
Map
├── HashMap → LinkedHashMap
├── TreeMap
├── WeakHashMap
├── IdentityHashMap
├── Hashtable
└── ConcurrentHashMap五、核心区别与适用场景
| 集合类型 | 底层实现 | 特点 | 适用场景 |
|---|---|---|---|
| ArrayList | 动态数组 | 查询快,增删慢 | 频繁随机访问,数据量稳定 |
| LinkedList | 双向链表 | 增删快,查询慢 | 频繁插入/删除,实现栈/队列 |
| HashSet | 哈希表 | 无序,去重 | 快速判断元素是否存在 |
| TreeSet | 红黑树 | 有序,去重 | 需要排序或范围查询 |
| HashMap | 哈希表 | 高效查询,允许 null 键/值 | 大多数键值对存储场景 |
| ConcurrentHashMap | 分段锁/CAS | 高并发安全 | 多线程环境下的键值存储 |
六、总结
• List:有序可重复,按索引访问,根据增删/查询频率选择 ArrayList 或 LinkedList。 • Set:无序唯一,根据排序需求选择 HashSet(无序)或 TreeSet(有序)。 • Map:键值对存储,优先用 HashMap,高并发场景用 ConcurrentHashMap。 • 线程安全:避免使用 Vector/Hashtable,优先选择并发包中的集合类。
理解集合体系的设计思想和性能特点,能帮助开发者针对不同场景选择最优解决方案。
