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 集合框架中最核心、最容易混淆的几组对比,希望对您的学习有所帮助!

相关推荐
Joy T9 分钟前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
java·人工智能·后端·spring·agent入门·agent state
估值探索者11 分钟前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
RAN114267600822 分钟前
1.3第一个程序的介绍
开发语言·qt
天若有情67322 分钟前
C++花式魔改!手写头文件复刻Java语法,彻底打破编码思维定式
java·c++·语言做语言·jac++
blue_ice .1 小时前
Verilog DDS 数字信号发生器:DAC 输出模拟波形与 ADC 回采观测
开发语言·单片机·嵌入式硬件·fpga开发
远翔调光芯片^138287988721 小时前
ECP5702能芯科技PD取电芯片在市场上的优势有哪些?
开发语言·人工智能·单片机·嵌入式硬件·智能家居
西峰u2 小时前
Java单例模式|从基础到多线程安全
java·java单例模式
ClinicTech2 小时前
实验室洗瓶机的清洗系统架构与自动化控制解析
java·python
linmengmeng_13142 小时前
【总结】MyBatis-Plus批量插入与清表的正确姿势
java·spring boot·mysql·mybatis
木井巳2 小时前
【记忆化搜索】不同路径
java·算法·leetcode·深度优先·剪枝·推荐算法