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

相关推荐
知识即是力量ol1 小时前
口语八股——Redis 面试实战指南(二):缓存篇、分布式锁篇
java·redis·缓存·面试·分布式锁·八股
金銀銅鐵1 小时前
浅解 Junit 4 第四篇:类上的 @Ignore 注解
java·junit·单元测试
西门吹雪分身2 小时前
K8S之Pod生命周期
java·kubernetes·k8s
hrhcode2 小时前
【Netty】一.Netty架构设计与Reactor线程模型深度解析
java·spring boot·后端·spring·netty
亓才孓2 小时前
[Spring MVC]BindingResult
java·spring·mvc
大黄说说2 小时前
Go 实战 LeetCode 151:高效翻转字符串中的单词(含空格处理技巧)
开发语言·leetcode·golang
会算数的⑨2 小时前
Spring AI Alibaba 学习(三):Graph Workflow 深度解析(下篇)
java·人工智能·分布式·后端·学习·spring·saa
有味道的男人2 小时前
除了Python,还有哪些语言可以调用1688商品详情API?
开发语言·python
chilavert3182 小时前
技术演进中的开发沉思-367:锁机制(上)
java·开发语言·jvm