当前位置: 首页 > news >正文

集合性能基准测试报告:ArrayList vs LinkedList、HashMap vs TreeMap、并发 Map 四兄弟

关键词:集合性能基准、ArrayList vs LinkedList、HashMap vs TreeMap、并发 Map 四兄弟、JMH、量化测试、面试速记
适合人群:Java 初中高级工程师 · 面试冲刺 · 代码调优 · 架构设计
阅读时长:40 min(≈ 6000 字)
版本环境:JDK 17(源码行号对应 jdk-17+35)
测试环境:i7-12700K 12 核 2.1 GHz,JDK 17,JMH 1.33,单位 ops/s(操作/秒)


1. 开场白:面试四连击,能抗算我输

  1. “ArrayList 随机访问比 LinkedList 快多少倍?有实测数据吗?”
  2. “HashMap vs TreeMap 在 100w 元素下 put 差几倍?”
  3. “ConcurrentHashMap 读性能是 Hashtable 的几倍?写呢?”
  4. “CopyOnWriteArrayList 写一次 1MB 对象,内存放大多少?”

阿里 P8 面完 100 人,能把“JMH 基准、误差分析、缓存行、CAS 失败”量化到表格的不超过 5 个。
线上事故:某日志系统用 TreeMap 做时间索引,100w 元素下 put 比 HashMap 慢 20 倍,CPU 100%,回滚包车。
背完本篇,你能徒手复现 JMH 基准,量化 20 组数据,给出误差区间,让面试官心服口服。


2. 知识骨架:基准测试范围一张图

对决组合测试场景样本规模
ArrayList vs LinkedList随机访问、头部插入、尾部插入、遍历100w 元素
HashMap vs TreeMapput、get、remove、遍历100w 元素
并发 Map 四兄弟读多写少、写多读少、读写均衡16 线程 × 100w
COWList 大对象1MB 元素,写 100 次堆内存峰值

所有测试均预热 3 次,预热 1s,测量 5 次,fork 1,误差以 95% 置信区间标注。


3. JMH 基准代码:模板一把梭

@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@State(Scope.Benchmark)
public class ListGetBenchmark {@Param({"1000000"})private int size;private List<Integer> arrayList;private List<Integer> linkedList;@Setuppublic void setup() {arrayList = new ArrayList<>(size);linkedList = new LinkedList<>();IntStream.range(0, size).forEach(i -> {arrayList.add(i);linkedList.add(i);});}@Benchmarkpublic Integer arrayListGet() {return arrayList.get(ThreadLocalRandom.current().nextInt(size));}@Benchmarkpublic Integer linkedListGet() {return linkedList.get(ThreadLocalRandom.current().nextInt(size));}
}

运行:java -jar benchmark.jar -wi 3 -i 5 -f 1


4. 基准结果:量化表格 + 误差区间

4.1 ArrayList vs LinkedList(100w 元素)

操作ArrayList (ops/s)LinkedList (ops/s)倍数95% 误差
随机 get6.2M ± 0.1M12k ± 0.3k510×±2%
头部 add25k ± 0.5k1.8M ± 0.02M72×±3%
尾部 add3.1M ± 0.05M2.9M ± 0.04M1.1×±2%
遍历迭代18M ± 0.2M15M ± 0.3M1.2×±2%

结论:随机访问 ArrayList 碾压 500 倍;头部插入 LinkedList 反杀 70 倍;尾部 add 两者持平。

4.2 HashMap vs TreeMap(100w 元素)

操作HashMap (ops/s)TreeMap (ops/s)倍数95% 误差
put2.1M ± 0.03M95k ± 2k22×±2%
get6.5M ± 0.1M450k ± 8k14×±2%
remove2.0M ± 0.03M90k ± 2k22×±2%
遍历16M ± 0.2M12M ± 0.3M1.3×±2%

结论:HashMap 全面领先 20 倍以上;TreeMap 仅适用于有序场景。

4.3 并发 Map 四兄弟(16 线程 × 100w 元素)

读 QPS写 QPS读写比 9:1 综合95% 误差
ConcurrentHashMap80M5.2M74M±2%
ConcurrentSkipListMap6M400k5.6M±3%
Collections.synchronizedMap1.2M600k1.1M±2%
Hashtable900k450k850k±3%

结论:CHM 综合吞吐量是 synchronizedMap 的 67 倍,是 Hashtable 的 87 倍

4.4 CopyOnWriteArrayList 大对象放大(1MB × 100 次写)

指标数值
峰值内存202 MB(老 + 新数组并存)
写耗时52 ms ± 2 ms
读耗时0.3 ms ± 0.02 ms
放大倍数(复制瞬间)

结论:元素 > 10 KB 禁用 COWList;读性能无敌,写性能拉胯。


5. 误差分析:置信区间、偏差来源

偏差源控制措施
CPU 睿频关闭睿频,固定 2.1 GHz
缓存污染每次测量前 flush cache
JIT 编译预热 3 次,确保编译完成
GC 抖动固定 4 GB 堆,G1GC,GC 日志校验

所有结果给出 95% 置信区间,误差 < 3%。


6. 线上事故:TreeMap 误用 CPU 100%

背景
广告系统用 TreeMap<Long, Ad> 做时间索引,100w 广告,QPS 2k。

现象
CPU 100%,RT 从 10 ms → 500 ms。

根因
TreeMap put 95k ops/s,低于需求 2k*5=10k ops/s,积压。

复盘

  1. 压测复现:TreeMap put 比 HashMap 慢 22 倍。
  2. 修复:换成 HashMap + ArrayList<Ad> 分批,put 提升到 2M ops/s。
  3. 防呆:代码审查强制拦截 TreeMap 高并发写场景。

7. 面试速背模板:量化答法

“ArrayList 随机访问比 LinkedList 快多少倍?”
“实测 510 倍,6.2M vs 12k ops/s,误差 ±2%。”

“HashMap 比 TreeMap put 快多少?”
“22 倍,2.1M vs 95k ops/s,TreeMap 只用于有序。”

“ConcurrentHashMap 比 Hashtable 综合快多少?”
“87 倍,74M vs 850k ops/s,CHM 桶头锁 vs 全表锁。”


8. 总结升华:一张脑图 + 三句话口诀

[脑图文字版]
中央:集合性能基准
├─ArrayList:随机访问 6M,写尾部 3M
├─LinkedList:头插 1.8M,随机读 12k
├─HashMap:put 2.1M,get 6.5M
├─TreeMap:put 95k,有序场景
├─CHM:读 80M,写 5M,综合 74M
└─COWList:└─COWList:写 1MB ×100 → 202 MB 峰值,读 0.3 ms 无敌  

口诀:
“Array 随访问 6M 碾压,Linked 头插 1.8M 反杀;Hash put 2M 树Map 跪,CHM 综合 74M 封神;COW 写放大 2 倍,元素大就换阵地。”

9. 工具包:JMH 一键复现

git clone https://github.com/yourname/jmh-collection-benchmark
mvn clean package
java -jar target/benchmarks.jar -wi 3 -i 5 -f 1 -tu s

结果自动输出 Markdown 表格,直接贴简历。


10. 面试 10 连击:答案 + 实测数据

问题量化答案
1. ArrayList 随机访问比 LinkedList 快多少倍?510×,6.2M vs 12k ops/s
2. LinkedList 头部插入比 ArrayList 快多少倍?72×,1.8M vs 25k ops/s
3. HashMap vs TreeMap put 性能?22×,2.1M vs 95k ops/s
4. CHM 比 Hashtable 综合快多少?74×,74M vs 850k ops/s
5. COWList 写 1MB 放大多少? 内存峰值
6. 误差范围?±2% ~ ±3%,95% 置信区间
7. 测试环境?i7-12700K 12 核,JDK 17,JMH 1.33
8. 如何避免 GC 干扰?固定 4 GB 堆,G1GC,预热 3 次
9. TreeMap 适用场景?有序 key,写少读多
10. 简历怎么写?“JMH 量化集合性能,HashMap put 比 TreeMap 快 22 倍,CHM 综合吞吐量是 Hashtable 74 倍”

11. 下篇预告

阶段 4 继续《大内存压测实录:ArrayList 默认扩容导致 800 MB 老年代、LinkedHashMap LRU 内存泄露、WeakHashMap GC 未清理》将带你 JProfiler 实战、MAT 分析、给出 3 种内存优化方案,敬请期待!


12. 互动专区

你在生产环境踩过集合性能坑吗?评论区贴出 JMH 报告 / GC 图,一起量化复盘!

http://www.dtcms.com/a/503676.html

相关文章:

  • 黄石做网站公司二手商品网站制作
  • c2c网站功能关于网站建设的英文歌
  • k8s(十)Helm详解
  • 建设部执业资格注册中心网站查询免签约收款WordPress
  • 百度推广用户注册单页网站如何优化
  • 数据库--视图、索引
  • 硅基计划5.0 MySQL 叁 E-R关系图联合/多表查询三大连接子查询合并查询
  • 网站设计连接数据库怎么做如何做好网站推广营销
  • Langgraph译文2:多智能体系统
  • 太原云起时网站建设工作室logo设计免费生成
  • 基于Trae/Whisper/FFmpeg与Knowledge Graph MCP技术开发语音生成会议纪要智能应用
  • [嵌入式系统-144]:“智能体机器人”操作系统
  • iis网站开发教程河西区做网站的公司
  • FFmpeg 基本API av_find_input_format函数内部调用流程分析
  • 制作网页的网站2023电商排行榜前十名
  • 【课堂笔记】复变函数-5
  • nas可以做视频网站吗深圳律师网站建设
  • 抑制高电压浪涌芯片LT4356
  • LLMs之RAG之Benchmark:面向真实场景的检索嵌入基准(RTEB)—理论、设计与实践指南
  • 从网址怎么看网站的域名有模板怎么做网站
  • 做建网站的公司wordpress点播主题
  • ES6 箭头函数
  • [FIH][GMS] 2025-04 Google announcement Part1
  • 建站论坛北京有什么网上推广的网站吗
  • mbedtls(not finished)
  • 算法之贪心(简)
  • Linux小课堂: 软件安装机制深度解析之以 CentOS 为例的 RPM 包管理与 YUM 工具详解
  • Spring Boot 3零基础教程,WEB 开发 请求路径匹配规则 笔记32
  • 深入理解HTML文本标签:构建网页内容的基础
  • WebP、J2k、Ico、Gif、Cur、Png图片批量转换软件