跳到主要内容Java 常用数据结构及核心 API(开发 / 刷题高频版) | 极客日志Javajava算法
Java 常用数据结构及核心 API(开发 / 刷题高频版)
综述由AI生成系统梳理了 Java 常用数据结构,涵盖 List、Set、Map、Queue/Deque、Stack 五大类及工具类 Collections。详细介绍了 ArrayList、HashMap 等核心实现原理、底层结构、高频 API 及适用场景,并补充了线程安全、null 处理、去重原理及选型速查表,适用于开发与算法刷题参考。
Pythonist27 浏览 Java 常用数据结构及核心 API(开发 / 刷题高频版)
Java 中常用数据结构主要集中在 java.util 包下,核心分为List、Set、Map、Queue/Deque、Stack 五大类,还有配套的工具类 Collections 用于数据结构的通用操作。以下按使用频率从高到低整理,每个结构包含核心特点、底层实现、高频 API、适用场景,兼顾开发和算法刷题需求,API 仅列最常用的,简洁易记。
一、List 集合(有序、可重复,按索引访问)
核心特性:元素有序(插入顺序 = 存储顺序)、允许重复元素、支持通过索引快速访问,是开发中最常用的集合类型。
1. ArrayList(高频首选)
- 核心特点:底层基于动态数组实现,查询快、尾部增删快、中间增删慢(需移动元素),非线程安全,效率高。
- 底层:Object 数组,初始容量 10,扩容时默认 1.5 倍扩容。
- 适用场景:频繁查询、尾部增删,少量中间增删,非并发场景(开发 / 刷题首选)。
高频 API:
List<String> list = new ArrayList<>();
list.add("a");
list.add(1, "b");
list.get(0);
list.remove(0);
list.remove("a");
list.set(0, "c");
list.contains("a");
list.size();
list.isEmpty();
list.clear();
list.iterator();
for (String s : list) {}
2. LinkedList
- 核心特点:底层基于双向链表实现,中间增删快(仅需修改节点指针)、查询慢(需从头 / 尾遍历),,同时实现了 接口,可作为队列 / 栈使用。
非线程安全
Deque
适用场景:频繁中间增删、作为队列 / 栈使用,非并发场景。高频 API:与 ArrayList 通用 API 一致,额外增加链表专属头尾操作(作为队列 / 栈时用):
LinkedList<String> link = new LinkedList<>();
link.addFirst("a");
link.addLast("b");
link.getFirst();
link.getLast();
link.removeFirst();
link.removeLast();
3. Vector(过时,了解即可)
- 核心特点:底层同 ArrayList(动态数组),线程安全(所有方法加
synchronized),效率低,扩容时默认 2 倍扩容。
- 适用场景:几乎不用,并发场景推荐
CopyOnWriteArrayList。
二、Set 集合(无序、不可重复,无索引)
核心特性:元素无序(存储顺序≠插入顺序,除 LinkedHashSet)、不可重复(底层通过 equals()+hashCode() 保证)、无索引(不能通过索引访问),常用于去重。
1. HashSet(高频首选)
- 核心特点:底层基于HashMap实现(用 key 存元素,value 为默认常量),无序、不可重复,非线程安全,允许存储
null 元素(仅一个),查找 / 增删效率高(O(1))。
- 适用场景:快速去重、无需保证顺序,非并发场景(开发 / 刷题首选)。
高频 API:无索引相关方法,其余与 List 通用(无 get/set/ 带索引的 add/remove):
Set<String> set = new HashSet<>();
set.add("a");
set.remove("a");
set.contains("a");
set.size();
set.isEmpty();
set.clear();
for (String s : set) {}
2. LinkedHashSet
- 核心特点:底层基于LinkedHashMap实现,有序(插入顺序 = 存储顺序)、不可重复,非线程安全,效率略低于 HashSet(需维护链表顺序)。
- API:与 HashSet 完全一致,仅有序性不同。
- 适用场景:去重且需要保证插入顺序。
3. TreeSet
- 核心特点:底层基于红黑树实现,可排序(自然排序 / 自定义排序)、不可重复,非线程安全,不允许存储
null 元素,查找 / 增删效率 O(log n)。
- 适用场景:去重且需要对元素排序(自然排序 / 自定义排序)。
高频 API:基础 API 同 HashSet,新增排序相关方法:
Set<Integer> treeSet = new TreeSet<>();
Set<Integer> customSet = new TreeSet<>((o1, o2) -> o2 - o1);
customSet.add(3);
customSet.add(1);
customSet.add(2);
((TreeSet<Integer>) customSet).first();
((TreeSet<Integer>) customSet).last();
((TreeSet<Integer>) customSet).ceiling(2);
((TreeSet<Integer>) customSet).floor(2);
三、Map 集合(键值对、键唯一,值可重复)
核心特性:以**键值对(Key-Value)**存储数据,Key 唯一(不可重复,底层同 Set)、Value 可重复,支持通过 Key 快速查找 Value,是开发中高频使用的结构。
1. HashMap(高频首选)
- 核心特点:底层基于数组 + 链表 + 红黑树实现(JDK8+),无序(键的存储顺序≠插入顺序),Key 唯一、Value 可重复,允许
null 键(仅一个)和 null 值,非线程安全,查找 / 增删效率 O(1)。
- 适用场景:快速键值对查找、存储,无需保证顺序,非并发场景(开发 / 刷题首选)。
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.putIfAbsent("a", 2);
map.get("a");
map.getOrDefault("b", 0);
map.remove("a");
map.containsKey("a");
map.containsValue(1);
map.size();
map.isEmpty();
map.clear();
for (String key : map.keySet()) {
Integer value = map.get(key);
}
for (Map.Entry<String, Integer> entry : map.entrySet()) {
entry.getKey();
entry.getValue();
entry.setValue(2);
}
for (Integer value : map.values()) {}
2. LinkedHashMap
- 核心特点:底层基于HashMap + 双向链表实现,有序(插入顺序 / 访问顺序)、Key 唯一,其余特性同 HashMap,效率略低于 HashMap。
- 适用场景:键值对存储且需要保证插入 / 访问顺序(如实现 LRU 缓存的基础)。
API:与 HashMap 完全一致,仅有序性不同,可通过构造方法指定有序类型:
Map<String, Integer> linkMap = new LinkedHashMap<>(16, 0.75f, true);
3. TreeMap
- 核心特点:底层基于红黑树实现,键可排序(自然排序 / 自定义排序),Key 唯一,不允许
null 键,允许 null 值,非线程安全,查找 / 增删效率 O(log n)。
- 适用场景:键值对存储且需要对键排序。
高频 API:基础 API 同 HashMap,新增排序相关方法:
Map<Integer, String> treeMap = new TreeMap<>();
Map<Integer, String> customMap = new TreeMap<>((o1, o2) -> o2 - o1);
customMap.put(3, "c");
customMap.put(1, "a");
customMap.put(2, "b");
customMap.firstKey();
customMap.lastKey();
customMap.ceilingKey(2);
customMap.floorKey(2);
customMap.subMap(1, 3);
4. Hashtable(过时,了解即可)
- 核心特点:底层同 HashMap(JDK8 前数组 + 链表),线程安全(所有方法加
synchronized),效率低,不允许 null 键和 null 值。
- 适用场景:几乎不用,并发场景推荐
ConcurrentHashMap。
5. ConcurrentHashMap(并发高频)
- 核心特点:底层同 HashMap(数组 + 链表 + 红黑树),线程安全(JDK8 + 采用 CAS + 分段锁,效率远高于 Hashtable),不允许
null 键和 null 值,是并发场景下的首选 Map。
- API:与 HashMap 基本一致,支持并发操作,无需额外加锁。
- 适用场景:多线程并发的键值对存储 / 查找。
四、Queue/Deque 队列(先进先出 FIFO / 双端队列)
核心特性:Queue 是单端队列(先进先出),仅支持队首出队、队尾入队;Deque 是双端队列(Double Ended Queue),支持队首 / 队尾双向入队、出队,可替代 Stack 实现栈(后进先出)。
1. 单端队列 Queue - PriorityQueue(优先级队列,刷题高频)
- 核心特点:底层基于二叉堆实现,无序,出队时按优先级(自然排序 / 自定义排序)出队,而非插入顺序,非线程安全,允许
null 元素(但不推荐,会抛异常)。
- 默认规则:默认是小顶堆(优先级最高的是最小元素,出队时先出最小值)。
- 适用场景:算法刷题(TopK 问题、堆排序)、业务中的优先级任务调度。
Queue<Integer> minHeap = new PriorityQueue<>();
Queue<Integer> maxHeap = new PriorityQueue<>((o1, o2) -> o2 - o1);
maxHeap.offer(3);
maxHeap.offer(1);
maxHeap.offer(2);
maxHeap.peek();
maxHeap.poll();
maxHeap.size();
maxHeap.isEmpty();
2. 双端队列 Deque - ArrayDeque(高频首选)
- 核心特点:底层基于动态数组实现,双端入队 / 出队效率高,非线程安全,不允许
null 元素,是替代 Stack 的首选(Stack 底层是 Vector,效率低)。
- 适用场景:需要双端操作的队列、替代 Stack 实现栈(开发 / 刷题首选)。
高频 API:兼具**队列(FIFO)和栈(LIFO)**的所有操作:
Deque<Integer> deque = new ArrayDeque<>();
deqeue.offerLast(1);
deqeue.offerFirst(2);
deqeue.peekFirst();
deqeue.pollFirst();
deqeue.push(1);
deqeue.push(2);
deqeue.peek();
deqeue.pop();
deqeue.size();
deqeue.isEmpty();
deqeue.clear();
3. LinkedBlockingQueue(并发队列)
- 核心特点:底层基于双向链表实现,线程安全的阻塞队列,满队时入队阻塞,空队时出队阻塞。
- 适用场景:多线程并发的任务排队(如线程池的任务队列)。
五、Stack 栈(后进先出 LIFO,推荐用 Deque 替代)
- 核心特点:底层基于Vector实现,后进先出,非线程安全,效率低,官方推荐用 Deque(ArrayDeque) 替代(Deque 的 push/pop/peek 方法完全兼容栈操作)。
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.peek();
stack.pop();
stack.empty();
六、工具类 Collections(数据结构通用操作)
java.util.Collections 是静态工具类,提供了针对 List、Set、Map 的通用静态方法,用于排序、查找、反转、同步包装等,无需创建对象,直接调用。
高频静态 API
List<Integer> list = new ArrayList<>(Arrays.asList(3, 1, 2));
Collections.sort(list);
Collections.sort(list, (o1, o2) -> o2 - o1);
Collections.binarySearch(list, 2);
Collections.reverse(list);
Collections.shuffle(list);
Collections.addAll(list, 4, 5, 6);
Collections.max(list);
Collections.min(list);
List<Integer> syncList = Collections.synchronizedList(new ArrayList<>());
Map<String, Integer> syncMap = Collections.synchronizedMap(new HashMap<>());
List<Integer> unmodList = Collections.unmodifiableList(list);
unmodList.add(7);
七、核心注意事项(开发 / 刷题避坑)
- 线程安全:默认集合(ArrayList/HashMap/HashSet 等)均非线程安全,并发场景需用专用并发集合(ConcurrentHashMap/CopyOnWriteArrayList/ConcurrentLinkedQueue),而非 Collections 的同步包装。
- null 值处理:HashMap/HashSet 允许
null(键仅一个),TreeMap/TreeSet/PriorityQueue 不允许 null,ConcurrentHashMap/Hashtable 不允许 null 键 / 值。
- Set/Map 去重原理:基于
equals() 和 hashCode() 方法,自定义对象作为 Key/Set 元素时,必须重写这两个方法,否则无法保证去重。
- 遍历与修改:遍历集合时(增强 for / 迭代器),不能直接调用集合的 remove/add 方法,会抛
ConcurrentModificationException,需用迭代器的 remove 方法。
- 栈的替代:官方推荐用 Deque(ArrayDeque) 替代 Stack,效率更高,API 更通用。
八、高频数据结构选型速查表
| 业务需求 | 首选数据结构 | 次选数据结构 |
|---|
| 有序可重复、频繁查询 | ArrayList | Vector(过时) |
| 有序可重复、频繁增删 | LinkedList | - |
| 去重、无需有序 | HashSet | - |
| 去重、需插入顺序 | LinkedHashSet | - |
| 去重、需排序 | TreeSet | - |
| 键值对、快速查找、无序 | HashMap | Hashtable(过时) |
| 键值对、需插入 / 访问顺序 | LinkedHashMap | - |
| 键值对、需键排序 | TreeMap | - |
| 键值对、并发场景 | ConcurrentHashMap | Collections.synchronizedMap |
| 队列、先进先出 | ArrayDeque(Deque) | LinkedList |
| 队列、优先级调度 | PriorityQueue | - |
| 栈、后进先出 | ArrayDeque(Deque) | Stack(过时) |
| 并发队列 | LinkedBlockingQueue | ConcurrentLinkedQueue |
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online