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

相关推荐
汤米粥7 小时前
Python爬虫中Xpath用法之——normalize-space()
开发语言·python
FREEDOM_X7 小时前
Linux 多线程编程——总结
java·linux·运维·ubuntu
科技道人7 小时前
记录 设置-显示大小和字体
开发语言·android设置·字体和显示大小
tmlx3I0817 小时前
Tomcat的架构设计和启动过程详解
java·tomcat
浮江雾7 小时前
Flutter第三节----Dart中的数据类型
android·开发语言·学习·flutter·入门·函数
weixin_422329317 小时前
AgentScope Java 项目入门 & Builder 深度解读
java·开发语言·人工智能
shepherd1267 小时前
一次把 Spring MVC 文件上传参数“查没了”的排查:multipart、Filter 与 request body 的连环坑
java·后端·spring·mvc
宠友信息7 小时前
Spring Boot与异步审核构建仿小红书源码内容发布全流程
java·数据库·spring boot·redis·mysql·oracle·uni-app
chh5637 小时前
C++--list
开发语言·数据结构·c++·学习·算法·list
Listen·Rain8 小时前
Springboot整合RedisStack
java·spring boot·redis