请解释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。