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

相关推荐
lsx20240616 小时前
C AI 编程助手:助力开发者高效编程
开发语言
沐知全栈开发16 小时前
Eclipse 编译项目指南
开发语言
Dicky-_-zhang16 小时前
容器网络CNI实战:从零搭建网络插件
java·jvm
Mahir0816 小时前
Spring 事务深度解析:核心原理与 12 种事务失效场景全解
java·spring·面试·事务失效
无限进步_16 小时前
C++11概览与统一初始化
开发语言·c++
SL_staff16 小时前
从Zoom/腾讯会议迁移到私有化会议系统:数据迁移完整方案
java·架构
笨蛋不要掉眼泪16 小时前
Java并发编程:内存可见性与synchronized同步机制
java·开发语言·并发
用户39599249400616 小时前
Java开发者接入大模型API实战:从0到聊天机器人
java
爱喝水的鱼丶16 小时前
SAP-ABAP:数据类型与数据对象(8篇) 第四篇:关系映射篇——从类型定义到对象实例的转化逻辑
开发语言·数据库·学习·sap·abap
JAVA面经实录91716 小时前
Java 多线程完整版学习文档(无遗漏终版)
java·面试