请解释Java中常用的Collection集合的类层次结构。
参考回答
在 Java 中,Collection
是集合框架的核心接口之一,其下有多个子接口和实现类。常用的 Collection
接口类层次结构主要包括以下内容:
Collection
接口:是集合的根接口,定义了最基本的集合操作。List
接口:表示有序、可重复的集合。ArrayList
:基于动态数组实现。LinkedList
:基于双向链表实现。Vector
:线程安全,已较少使用。
Set
接口:表示无序、不可重复的集合。HashSet
:基于哈希表实现。TreeSet
:基于红黑树实现,元素有序。LinkedHashSet
:基于哈希表和链表实现,保证插入顺序。
Queue
接口:表示队列,通常是先进先出(FIFO)。PriorityQueue
:元素按照优先级排序。LinkedList
:可作为队列使用。
Map
接口(不属于 Collection,但常用):用于存储键值对。HashMap
:无序存储。TreeMap
:键值有序存储。LinkedHashMap
:保持插入顺序。
详细讲解与拓展
1. Collection 接口
Collection
是 Java 集合框架的根接口,定义了操作集合的通用方法。它有三个主要子接口:List
、Set
和 Queue
。
2. Collection 的类层次结构
以下是详细的层次结构:
java.util.Collection
├── List
│ ├── ArrayList
│ ├── LinkedList
│ └── Vector
│ └── Stack
├── Set
│ ├── HashSet
│ │ └── LinkedHashSet
│ └── SortedSet
│ └── TreeSet
└── Queue
├── LinkedList
├── PriorityQueue
└── Deque
├── ArrayDeque
└── LinkedList (also implements Deque)
3. 各接口和类的特点
List
- 特点:有序、可重复,允许通过索引访问元素。
- 实现类:
ArrayList
:底层是动态数组,查询快,插入和删除慢,非线程安全。LinkedList
:底层是双向链表,插入和删除快,查询慢,既可以用作列表,也可以用作队列。Vector
:底层是动态数组,线程安全,但效率低,已较少使用。Stack
:继承自Vector
,实现了先进后出(LIFO)栈结构。
例子:
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
System.out.println(list); // 输出:[A, B]
Set
- 特点:无序、不可重复。
- 实现类:
HashSet
:基于哈希表,元素无序,插入和删除效率高。LinkedHashSet
:基于哈希表和链表,保持插入顺序。TreeSet
:基于红黑树,元素自动排序。
例子:
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(1); // 重复元素被忽略
System.out.println(set); // 输出:[1, 2]
Queue
- 特点:先进先出(FIFO),常用于排队场景。
- 实现类:
LinkedList
:实现了Queue
接口,同时支持双端队列操作。PriorityQueue
:优先级队列,元素按照自然顺序或指定的比较器顺序排列。ArrayDeque
:高效的双端队列实现。
例子:
Queue<String> queue = new LinkedList<>();
queue.add("A");
queue.add("B");
queue.poll(); // 移除队头元素
System.out.println(queue); // 输出:[B]
4. Map(键值对集合)
虽然 Map
不继承 Collection
接口,但它是 Java 集合框架的重要部分,用于存储键值对。
java.util.Map
├── HashMap
│ └── LinkedHashMap
├── TreeMap
└── Hashtable
└── Properties
- 特点:
HashMap
:无序,允许null
键和值。LinkedHashMap
:保持插入顺序。TreeMap
:基于红黑树,键有序。Hashtable
:线程安全,已过时,较少使用。
例子:
Map<Integer, String> map = new HashMap<>();
map.put(1, "A");
map.put(2, "B");
System.out.println(map); // 输出:{1=A, 2=B}
5. 总结集合框架
接口/类 | 特点 | 用途 |
---|---|---|
List |
有序、可重复 | 动态数组,元素有序 |
Set |
无序、不可重复 | 去重集合 |
Queue |
FIFO,优先级处理 | 队列操作 |
Map |
键值对存储 | 映射关系存储 |
6. 拓展:集合选择指南
- 如果需要 随机访问 元素:使用
ArrayList
。 - 如果需要 频繁插入/删除:使用
LinkedList
或HashSet
。 - 如果需要 去重且排序:使用
TreeSet
或TreeMap
。 - 如果需要 线程安全 集合:使用
Collections.synchronizedList()
或ConcurrentHashMap
。