Java 集合详解:ArrayList、LinkedList、HashMap、TreeMap、HashSet 等核心类对比分析

Java 集合框架核心对比知识点

[Java 集合框架核心对比知识点](#Java 集合框架核心对比知识点)

[一、List 系列对比](#一、List 系列对比)

[二、Map 系列对比](#二、Map 系列对比)

[三、Set 系列对比](#三、Set 系列对比)

四、线程安全集合对比

五、其他核心概念对比

一、List 系列对比

1. ArrayList vs LinkedList

特性 ArrayList LinkedList
底层结构 动态数组 (Object[]) 双向链表 (Node)
随机访问 O(1) (通过索引直接定位) O(N) (需从头/尾遍历到指定位置)
头部/中部插入/删除 O(N) (需要移动后续元素) O(N) (需要先遍历到位置,然后修改指针)
尾部插入/删除 O(1) (摊销,扩容时 O(N)) O(1) (已知尾节点)
内存占用 相对紧凑,浪费少量空间 (扩容预留) 每个节点有额外指针开销 (prev, next),内存碎片化
迭代器并发修改异常 支持 (fast-fail) 支持 (fast-fail)
适用场景 频繁查询 ,偶发随机插入/删除 频繁在任意位置插入/删除,查询较少

二、Map 系列对比

2. HashMap vs TreeMap vs LinkedHashMap

特性 HashMap TreeMap LinkedHashMap
底层实现 哈希表 (数组 + 链表/红黑树) 红黑树 (自平衡二叉搜索树) 哈希表 + 双向链表
排序 无序 有序 (按键自然排序或自定义 Comparator) 有序 (按插入顺序,可配置为访问顺序)
性能 (平均) O(1) (查找/插入/删除) O(log N) (查找/插入/删除) O(1) (查找/插入/删除),略慢于 HashMap
Null 值 允许一个 null key,多个 null value 不允许 null key (会抛 NullPointerException),允许 null value 允许一个 null key,多个 null value
功能扩展 基础键值对映射 提供范围操作 (subMap, headMap, tailMap),获取最大/最小键 提供访问顺序迭代,可实现 LRU 缓存
线程安全
适用场景 需要高性能的键值对查找 需要排序范围查找 需要保持插入顺序

三、Set 系列对比

3. HashSet vs TreeSet vs LinkedHashSet

特性 HashSet TreeSet LinkedHashSet
底层实现 基于 HashMap 基于 TreeMap 基于 LinkedHashMap
排序 无序 有序 (同 TreeMap) 有序 (按插入顺序)
性能 (平均) O(1) O(log N) O(1)
Null 值 允许一个 null 不允许 null 允许一个 null
适用场景 高效的去重和查找 需要排序的去重集合 需要保持插入顺序的去重集合

四、线程安全集合对比

4. Vector vs ArrayList vs Collections.synchronizedList(ArrayList)

特性 Vector ArrayList Collections.synchronizedList(ArrayList)
线程安全 (方法级 synchronized) (方法级 synchronized)
性能 较慢 (同步开销大) 最快 较慢 (同步开销)
扩容策略 通常是2 倍 通常是1.5 倍 同被包装的 List (这里是 ArrayList)
推荐度 不推荐 (性能差) 单线程首选 替代 Vector,但仍性能不佳
替代方案 - - java.util.concurrent.CopyOnWriteArrayList (适用于读多写少场景)

5. Hashtable vs HashMap vs ConcurrentHashMap

特性 Hashtable HashMap ConcurrentHashMap
线程安全 (方法级 synchronized) (分段锁/CAS + synchronized)
性能 较慢 (同步开销大) 最快 高并发下性能优异
Null 值 不允许 null key 或 null value 允许一个 null key 和多个 null value 不允许 null key 或 null value
推荐度 不推荐 (性能差) 单线程首选 高并发场景首选

五、其他核心概念对比

6. 扩容机制回顾 (来自之前的讨论)

特性 ArrayList HashMap
扩容触发条件 size >= capacity size >= (capacity * loadFactor)
扩容比例 约 1.5 倍 2 倍
扩容后元素位置 不变 通常会改变 (重新哈希)
负载因子 (默认 0.75)
扩容目的 解决空间不足 解决哈希冲突过多

这份整理涵盖了 Java 集合框架中最核心、最容易混淆的几组对比,希望对您的学习有所帮助!

相关推荐
皮皮林5518 小时前
拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍~
java·spring boot
顺风尿一寸12 小时前
从 Java NIO poll 到 Linux 内核 poll:一次系统调用的完整旅程
java
程途知微12 小时前
JVM运行时数据区各区域作用与溢出原理
java
华仔啊14 小时前
为啥不用 MP 的 saveOrUpdateBatch?MySQL 一条 SQL 批量增改才是最优解
java·后端
xiaoye201816 小时前
Lettuce连接模型、命令执行、Pipeline 浅析
java
beata20 小时前
Java基础-18:Java开发中的常用设计模式:深入解析与实战应用
java·后端
Seven9720 小时前
剑指offer-81、⼆叉搜索树的最近公共祖先
java
雨中飘荡的记忆2 天前
保证金系统入门到实战
java·后端
Nyarlathotep01132 天前
Java内存模型
java