java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java集合框架arraylist和linkedlist区别

java集合框架中arraylist和linkedlist的区别是什么

作者:别掉进我的异常

还在纠结java集合怎么选?本文对比了ArrayList与LinkedList、HashMap与TreeMap、HashSet与TreeSet等常见集合的底层实现、性能差异和适用场景,还分析了Vector、Hashtable与ConcurrentHashMap的线程安全方案,帮你快速找到适合业务需求的集合类

一、List 系列对比

1.ArrayListvsLinkedList

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

二、Map 系列对比

2.HashMapvsTreeMapvsLinkedHashMap

特性HashMapTreeMapLinkedHashMap
底层实现哈希表 (数组 + 链表/红黑树)红黑树 (自平衡二叉搜索树)哈希表 + 双向链表
排序无序有序 (按键自然排序或自定义 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.HashSetvsTreeSetvsLinkedHashSet

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

四、线程安全集合对比

4.VectorvsArrayListvsCollections.synchronizedList(ArrayList)

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

5.HashtablevsHashMapvsConcurrentHashMap

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

五、其他核心概念对比

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

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

六、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文