java - 为什么 ArrayList 总是比 LinkedList 快
问题描述
昨天我在 Java 17 中运行了一个基准测试,在那里我反复创建了一个新的 Arraylist 和 Linkedlist 并向其中添加了 10.000.000 个元素。
从 LinkedList 的性质来看,添加元素(创建 LinkedObject 并将其放在末尾)应该比添加到 ArrayList 快得多。(将整个数组复制到另一个稍大的数组中。)
像 arraycopy() 这样的原生函数真的那么快吗?LinkedList 唯一擅长的是将两个 LinkedList 合并在一起。
解决方案
大多数情况下,添加到 anArrayList
不会分配新数组,因为当需要增长时,实现会将支持数组的大小增加 50%。
从内存的角度来看,这可能听起来很浪费,但即使是增长的最坏情况ArrayList
使用的内存也比LinkedList
链表中的每个条目花费一个对象头 + 3 个引用(上一个/值/下一个),而最坏的情况生长ArrayList
每个条目只有 1.5 个引用(即,使用的数组单元,加上 50% 尚未使用)。
Anywho,根据我的计算,这意味着向默认启动的添加 1000 万个条目ArrayList
将导致大约 35 个数组复制操作,这不是很多。(是的,System.arraycopy
很快。)
最后,如果您给数组的初始容量为10_000_000
,则将生成零个数组副本。您可以尝试一下,看看复制的真正成本是多少。
推荐阅读
- lua - Lua self 方法调用尝试(一个 nil 值)
- react-native - React Native Expo 出现 Twitch API 401 错误
- php - GetChildHtml 方法为头块返回空字符串- Magento 1.9
- php - 实时服务器上的 IPN 未在 paypal 上更新表
- c++ - 类构造函数中的向量时出现运行时错误?
- java - 我如何理解频繁垃圾收集的原因?
- python - 在 Heroku 上部署烧瓶应用程序时在日志中显示应用程序崩溃
- python - 导入python文件时出现UnicodeError
- selenium - 当不存在禁用属性时,无法使用 selenium 处理禁用元素
- angular - 没有从 getRecipe() 获得价值