news 2026/8/11 6:23:07

Java 集合类全景介绍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 集合类全景介绍

Java 集合类全景介绍

面向前端开发者。如果你用 JS 的ArraySetMapObject,这篇文章帮你一次性认清 Java 所有集合类。


目录

  1. 先看 JS:你已会的集合类型
  2. Java 集合框架全景图
  3. List:有序可重复
  4. Set:无序不重复
  5. Queue / Deque:队列与双端队列
  6. Map:键值对
  7. 线程安全集合
  8. 怎么选?决策速查表
  9. 与 JS 的终极对照表

1. 先看 JS:你已会的集合类型

// JS 里的集合就这几种constarr=[1,2,3];// ← 什么都能干:列表 + 队列 + 栈constset=newSet([1,2,2]);// ← 去重constmap=newMap();// ← 键值对constobj={a:1,b:2};// ← 也是键值对

Java 不一样——每种数据结构有专门的类,一个场景一个最优解。

JSJava 对应说明
Array(列表)ArrayList最常用,动态数组
Array(要用队列/栈)ArrayDeque/LinkedListJava 不会用一个类干所有事
SetHashSet/TreeSet去重集合
MapHashMap/TreeMap键值对
Object(字符串 key)HashMap<String, V>Java 没有字面量对象

2. Java 集合框架全景图

Iterable (接口) │ Collection (接口) / | \ List Set Queue/Deque │ │ │ ┌────┴────┐ ┌──┴──┐ ┌──┴──┐ ArrayList LinkedList HashSet PriorityQueue │ │ Vector LinkedHashSet TreeSet Map (独立体系) / | \ HashMap TreeMap Hashtable │ LinkedHashMap │ ConcurrentHashMap

记住:Collection 是单值集合,Map 是键值对,两条线不互相继承。


3. List:有序可重复

和 JS 的Array最像。有索引、可重复、有顺序。

3.1 ArrayList(⭐⭐⭐⭐⭐ 最常用)

List<String>list=newArrayList<>();list.add("张三");list.add("李四");list.add("王五");list.get(0);// "张三"list.size();// 3list.remove(1);// 删除"李四"
特性说明
底层Object[]动态数组
查询O(1) — 直接通过下标访问
插入/删除O(n) — 需要搬移后续元素
扩容默认 10 → 1.5 倍扩容
适用读多写少(查数据快)

3.2 LinkedList

List<String>list=newLinkedList<>();list.add("张三");list.addFirst("队首");// Deque 的方法list.addLast("队尾");
特性说明
底层双向链表
查询O(n) — 需要从头遍历
插入/删除O(1) — 改指针即可(但定位到位置还是 O(n))
额外能力实现了Deque,可当队列/栈用
适用频繁头尾增删;但大部分场景 ArrayList 更好(内存连续,CPU 缓存友好)

3.3 Vector(⚠ 过时,不推荐)

// 和 ArrayList 几乎一样,但所有方法加了 synchronized// JDK 1.0 的老古董,现在用 Collections.synchronizedList() 或 CopyOnWriteArrayListList<String>vec=newVector<>();// ❌ 不推荐

3.4 ArrayList vs LinkedList 速查

ArrayListLinkedList
底层数组双向链表
get(i)O(1)O(n)
add(E)O(1) 均摊O(1)
add(0, E)O(n)O(1)
内存连续,浪费少每个节点额外存 prev/next 指针
用哪个?90% 选它只在频繁头插时考虑

4. Set:无序不重复

和 JS 的new Set()一样——去重。

4.1 HashSet(⭐⭐⭐⭐⭐ 最常用)

Set<String>set=newHashSet<>();set.add("Java");set.add("Python");set.add("Java");// 重复,被忽略set.size();// 2set.contains("Java");// true
特性说明
底层就是HashMap!(value 固定为PRESENT占位符)
顺序无序
复杂度add/remove/contains 都是 O(1)
去重依据hashCode()+equals()

4.2 LinkedHashSet

Set<String>set=newLinkedHashSet<>();set.add("C");set.add("A");set.add("B");// 遍历顺序:C → A → B(保持插入顺序)
特性说明
底层LinkedHashMap(HashSet + 双向链表维护顺序)
顺序保持插入顺序
代价比 HashSet 多一点点内存

4.3 TreeSet

Set<Integer>set=newTreeSet<>();set.add(5);set.add(1);set.add(3);// 遍历顺序:1 → 3 → 5(自然排序)
特性说明
底层TreeMap(红黑树)
顺序自动排序(自然序或 Comparator)
复杂度O(log n)
要求元素必须实现Comparable或传Comparator

4.4 Set 速查

HashSetLinkedHashSetTreeSet
顺序无序插入序排序序
复杂度O(1)O(1)O(log n)
去重依据hashCode + equalshashCode + equalscompareTo / Comparator
用哪个?只要去重去重 + 保持顺序去重 + 自动排序

5. Queue / Deque:队列与双端队列

5.1 Queue 接口方法

Queue<String>q=newLinkedList<>();// 三组方法,每组两个:一个抛异常,一个返回特殊值q.add("A");// 入队,失败抛异常q.offer("B");// 入队,失败返回 false ← 推荐q.remove();// 出队,空队抛异常q.poll();// 出队,空队返回 null ← 推荐q.element();// 看队首,空队抛异常q.peek();// 看队首,空队返回 null ← 推荐

5.2 实现类

底层场景
LinkedList双向链表实现了 List + Deque,既能当列表又能当队列
PriorityQueue二叉堆优先级队列—每次 poll 出最小/最大的元素
ArrayDeque循环数组推荐—比 LinkedList 快,当栈/队列首选

5.3 ArrayDeque:栈和队列的最佳实践

// 当栈用(替代 Stack)Deque<String>stack=newArrayDeque<>();stack.push("A");// 压栈stack.push("B");stack.pop();// "B"(后进先出)// 当队列用Deque<String>queue=newArrayDeque<>();queue.offer("A");// 入队queue.offer("B");queue.poll();// "A"(先进先出)

Java 官方推荐用 ArrayDeque 代替 Stack(Stack 是 JDK 1.0 的过时类)。


6. Map:键值对

和 JS 的Map/Object对应。Java 中最常用的数据结构之一。

6.1 HashMap(⭐⭐⭐⭐⭐ 最常用)

Map<String,Integer>map=newHashMap<>();map.put("张三",95);map.put("李四",87);map.get("张三");// 95map.containsKey("李四");// truemap.remove("张三");// 遍历for(Map.Entry<String,Integer>entry:map.entrySet()){System.out.println(entry.getKey()+" = "+entry.getValue());}// Java 8+ Lambdamap.forEach((k,v)->System.out.println(k+" = "+v));
特性说明
底层数组 + 链表 + 红黑树
顺序无序
get/putO(1) ~ O(log n)
null允许一个 null key,多个 null value
线程安全
深入原理Java-HashMap原理详解.md

6.2 LinkedHashMap

Map<String,Integer>map=newLinkedHashMap<>();map.put("C",3);map.put("A",1);map.put("B",2);// 遍历顺序:C → A → B(保持插入顺序)
特性说明
底层HashMap + 双向链表
顺序保持插入顺序(或 accessOrder=true 按访问顺序,实现 LRU)
// LRU 缓存的经典实现Map<String,Integer>lru=newLinkedHashMap<String,Integer>(16,0.75f,true){@OverrideprotectedbooleanremoveEldestEntry(Map.Entryeldest){returnsize()>100;// 超过 100 条自动删除最老的}};

6.3 TreeMap

Map<String,Integer>map=newTreeMap<>();map.put("C",3);map.put("A",1);map.put("B",2);// 遍历顺序:A → B → C(按 key 自然排序)
特性说明
底层红黑树
顺序按 key 排序
get/putO(log n)
null key❌ 不允许(因为要排序、比较)

6.4 Hashtable(⚠ 过时,不推荐)

Map<String,Integer>t=newHashtable<>();// ❌ 不推荐// 全方法 synchronized,性能差// 不允许 null key/value// 用 ConcurrentHashMap 替代

6.5 Map 速查

HashMapLinkedHashMapTreeMap
顺序无序插入序/ 访问序key 排序序
get/putO(1)~O(log n)O(1)~O(log n)O(log n)
null key
内存中(多链表指针)中(树节点)
用哪个?绝大多数场景需要有序遍历需要按 key 排序

7. 线程安全集合

前面所有的集合类都不是线程安全的(HashMap、ArrayList 等)。多线程场景需要用以下替代:

非线程安全线程安全替代方案
HashMapConcurrentHashMapCAS + synchronized 桶级锁
ArrayListCopyOnWriteArrayList写时复制,读多写少
HashSetCopyOnWriteArraySet写时复制
HashSetConcurrentHashMap.newKeySet()基于 ConcurrentHashMap
ArrayDequeConcurrentLinkedDeque无锁 CAS
LinkedList(Queue)ConcurrentLinkedQueue无锁 CAS
任意Collections.synchronizedXXX()全方法 synchronized(性能差)

选型建议

读多写少 → CopyOnWriteArrayList / CopyOnWriteArraySet 读写均衡 → ConcurrentHashMap / ConcurrentLinkedQueue 简单场景 → Collections.synchronizedList()(不推荐,性能差)

8. 怎么选?决策速查表

┌─── 需要键值对? ───→ Map │ ├── 无序 → HashMap │ ├── 按插入序 → LinkedHashMap │ └── 按 key 排序 → TreeMap │ 需要集合? ──┤ │ └─── 只需要值? ───→ Collection │ ┌─────────────┼─────────────┐ │ │ │ 需要重复? 需要去重? 需要 FIFO/LIFO? │ │ │ List Set Queue/Deque │ │ │ ┌─────┴─────┐ ┌───┴───┐ ┌───┴───┐ 读多: 头尾操作多: 无序: 保持序: 排序: 队列: 双端/栈: ArrayList LinkedList HashSet Linked- TreeSet 优先队列: ArrayDeque HashSet PriorityQueue

9. 与 JS 的终极对照表

JSJava说明
[1, 2, 3]ArrayList动态数组,最常用
[]当队列.push()+.shift()ArrayDeque/LinkedListJava 不应该用 List 当队列
[]当栈.push()+.pop()ArrayDeque(用push/pop替代过时的Stack
new Set([1,2,3])HashSet去重
TreeSet去重 + 排序(JS 没有内置等价物)
new Map()HashMap键值对
{}(字符串 key)HashMap<String, V>最相似的使用方式
Map保持插入序LinkedHashMapJS Map 默认保持插入序,Java 需要指定
TreeMapkey 排序的 Map(JS 没有)
无(单线程)ConcurrentHashMap多线程安全 Map

一句话记住:ArrayList + HashMap 覆盖 80% 场景,HashSet 去重,ArrayDeque 当栈/队列,LinkedHashMap 保序,TreeMap/TreeSet 排序,并发上 ConcurrentHashMap。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/11 6:20:20

YOLO小目标检测优化:新增检测层原理与实战指南

1. 项目概述&#xff1a;为什么小目标检测是YOLO系列的老大难问题&#xff1f; 在计算机视觉的落地项目里&#xff0c;小目标检测一直是个让人头疼的“钉子户”。无论是无人机巡检电力线路上的绝缘子缺陷&#xff0c;还是智慧交通里要看清远处模糊的车牌&#xff0c;或者是工业…

作者头像 李华
网站建设 2026/8/11 6:18:49

AI算力争夺战:OpenAI与微软的云计算博弈

1. 算力争夺战&#xff1a;OpenAI如何撼动微软的云计算霸权2023年11月&#xff0c;OpenAI董事会突然解雇CEO山姆奥特曼的事件震惊科技界。更戏剧性的是&#xff0c;微软迅速将奥特曼招致麾下&#xff0c;并给予他组建新AI团队的权限。这场人事地震背后&#xff0c;隐藏着一个价…

作者头像 李华
网站建设 2026/8/11 6:18:41

31万行重构Agent评测实战:从Prompt工程到动态环境交互的量化评估

1. 项目概述&#xff1a;一次关于Agent能力评测的深度重构 最近在AI圈里&#xff0c;一个关于“Agent评测”的项目引起了我的注意。它的标题很有意思——“不是靠Prompt&#xff1a;31万行重构的Agent评测实战”。这个标题直接戳中了当前大模型应用开发中的一个核心痛点&#x…

作者头像 李华
网站建设 2026/8/11 6:15:11

水性工业漆消泡剂:从选型到落地,搞定90%泡沫难题

一、别再乱加消泡剂&#xff1a;水性工业漆泡沫的常见隐形坑 做水性工业漆的朋友都懂&#xff0c;泡沫从来不是随便加两滴消泡剂就能解决的小事。很多工厂买了热门款水性工业漆消泡剂&#xff0c;结果要么分散釜一高速就溢料&#xff0c;要么喷完工件满是针孔缩孔&#xff0c;钱…

作者头像 李华
网站建设 2026/8/11 6:15:06

手串文创店 | 线上 DIY 小程序真的能提升到店体验

现在做手串、水晶文创的实体店越来越卷&#xff0c;纯靠线下到店选款&#xff0c;不仅客群受限&#xff0c;顾客决策成本也高&#xff0c;很多人逛一圈就走了&#xff0c;复购很难做起来。其实搭一个轻量化的线上 DIY 小程序&#xff0c;能把选款、搭配、预约、复购整个链路打通…

作者头像 李华
网站建设 2026/8/11 6:14:06

深入解析PyTorch ExtractorAgent:内核提取、参数打包与性能优化实战

1. 项目概述&#xff1a;为什么需要深入解读 ExtractorAgent&#xff1f;如果你正在使用或研究 PyTorch KernelAgent&#xff0c;那么 ExtractorAgent 绝对是你绕不开的核心模块。它不像调度器那样掌控全局&#xff0c;也不像执行器那样冲锋陷阵&#xff0c;但它扮演着“侦察兵…

作者头像 李华