【发布时间】:2021-12-19 09:03:15
【问题描述】:
昨天我在 Java 17 中运行了一个基准测试,在那里我反复创建了一个新的 Arraylist 和 Linkedlist,并向其中添加了 10.000.000 个元素。
根据 LinkedList 的性质,添加元素(创建 LinkedObject 并将其放在末尾)应该比添加到 ArrayList 快得多。 (将整个数组复制到另一个稍大的数组中。)
像 arraycopy() 这样的原生函数真的那么快吗? LinkedList 唯一擅长的是将两个 LinkedList 合并在一起。
【问题讨论】:
-
This answer 总结了为什么你基本上不应该使用
LinkedList。甚至 Joshua Bloch(谁写了LinkedList)never users it。 -
ArrayList 只有在重新分配时才需要复制,这种情况很少见。而且它不需要做任何簿记,或者为链接生成压缩引用,基本上只是 memset 到分配限制。 (JVM JIT 优化器可能不够聪明,无法优化多个重新分配并首先分配最终大小)。
-
@Nikolas:作为discussed in comments on the answer here,Performance differences between ArrayList and LinkedList 上接受的答案只是在中间插入,而不是在末尾,这就是在这种情况下使 ArrayList 变慢的原因,但不是在这种情况下案子。不是很好的重复,除非有其他答案确实涵盖了一般情况,或者包括这种情况。
标签: java arraylist linked-list benchmarking