Java容器类
·
一、Java容器类的整体架构
Java容器类主要位于java.util包下,核心分为两大体系,目的是解决不同的数据储存需求
| 体系 | 核心接口 | 存储特点 |
| 集合(Collection) | Collection | 储存单个元素的集合 |
| 映射(Map) | Map | 存储键值对(Key-Value) |
注意:Map并不继承Collection接口,是独立的顶级接口,但是通常和Collection一起被归为“容器类”。
二、核心接口与实现类详解
1. Collection 体系
(1)List:有序、可重复、有索引
- 核心特性:元素按插入顺序排列,允许重复元素,支持通过索引(下标)访问。
- 常用实现类:
ArrayList:- 底层:动态数组(数组扩容)。
- 特点:查询快(直接通过索引定位)、增删慢(需要移动元素)、非线程安全、效率高。
- 适用场景:频繁查询、少量增删的场景(如数据展示列表)。
LinkedList:- 底层:双向链表。
- 特点:查询慢(需要遍历链表)、增删快(仅需修改节点引用)、非线程安全。
- 适用场景:频繁增删、少量查询的场景(如队列 / 栈实现)。
Vector:- 底层:动态数组(与 ArrayList 类似)。
- 特点:线程安全(方法加了
synchronized)、效率低(已被淘汰,推荐用CopyOnWriteArrayList替代)。
(2)Set:无序、不可重复、无索引
- 核心特性:元素无序(存储顺序≠插入顺序),不允许重复元素,无索引(不能通过下标访问)。
- 常用实现类:
HashSet:- 底层:哈希表(HashMap 的键)。
- 特点:保证元素唯一(依赖
hashCode()和equals())、查询 / 增删效率高、非线程安全、无序。 - 适用场景:快速去重、无需排序的场景。
LinkedHashSet:- 底层:哈希表 + 双向链表。
- 特点:继承 HashSet,额外维护插入顺序,有序且唯一。
TreeSet:- 底层:红黑树(TreeMap 的键)。
- 特点:元素自动排序(自然排序或自定义 Comparator)、唯一、查询 / 增删效率中等。
(3)Queue:队列(先进先出 FIFO)
- 核心特性:模拟队列结构,专注于元素的入队 / 出队操作。
- 常用实现类:
LinkedList:实现了 Queue 接口,常用作非线程安全的队列。ArrayDeque:基于数组的双端队列(Deque),效率比 LinkedList 高,支持首尾增删。PriorityQueue:优先级队列,元素按优先级排序(而非插入顺序)。ConcurrentLinkedQueue:线程安全的无界队列(适用于高并发)。
2. Map 体系
- 核心特性:存储键值对(Key-Value),Key 唯一(重复 Key 会覆盖 Value),Value 可重复。
- 常用实现类:
HashMap:- 底层:哈希表(数组 + 链表 / 红黑树,JDK8 后优化)。
- 特点:无序、Key 唯一、非线程安全、效率高(允许 Key/Value 为 null)。
- 适用场景:绝大多数键值对存储场景(如缓存)。
LinkedHashMap:- 底层:哈希表 + 双向链表。
- 特点:继承 HashMap,维护插入顺序或访问顺序,有序且 Key 唯一。
TreeMap:- 底层:红黑树。
- 特点:Key 自动排序(自然排序 / 自定义 Comparator)、唯一、无 null Key。
Hashtable:- 底层:哈希表。
- 特点:线程安全(方法加 synchronized)、效率低、不允许 Key/Value 为 null(已被淘汰,推荐用
ConcurrentHashMap)。
ConcurrentHashMap:- 底层:分段哈希表(JDK7)/CAS + 同步块(JDK8)。
- 特点:线程安全、高并发下效率远高于 Hashtable,支持 null Value(Key 不可为 null)。
三、线程安全的容器类
日常开发中,上述大部分容器(如 ArrayList、HashMap)是非线程安全的,多线程环境下需使用线程安全的替代类:
- 直接包装:通过
Collections.synchronizedXxx()方法(如Collections.synchronizedList(new ArrayList<>())),但效率较低。 - 专用实现类:
- List:
CopyOnWriteArrayList(写时复制,适合读多写少)。 - Set:
CopyOnWriteArraySet。 - Map:
ConcurrentHashMap(高并发首选)。 - Queue:
ArrayBlockingQueue、LinkedBlockingQueue(阻塞队列,适用于生产者消费者模型)。
- List:
四、核心使用示例
1. ArrayList 基本使用
import java.util.ArrayList;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
// 添加元素
list.add("Java");
list.add("Python");
list.add("Java"); // 允许重复
// 通过索引访问
System.out.println(list.get(0)); // 输出:Java
// 遍历
for (String s : list) {
System.out.println(s);
}
// 删除元素
list.remove(1); // 删除索引1的元素(Python)
}
}
2. HashMap 基本使用
import java.util.HashMap;
import java.util.Map;
public class MapDemo {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
// 添加键值对
map.put("张三", 20);
map.put("李四", 25);
map.put("张三", 21); // 重复Key,覆盖Value
// 获取Value
System.out.println(map.get("张三")); // 输出:21
// 遍历键值对
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
}
更多推荐

所有评论(0)