与LinkedList

时间:2016-08-12 15:59:32

标签: java performance arraylist linked-list

我开始看到越来越多的基准测试,证明ArrayList在“大型”的性能方面破坏了LinkedList。插入以下示例: Gluelist

Adding(1M) Elements (5 Tests Avg.)

LinkedList: 174.8 milliseconds
ArrayList:  76.4 milliseconds
GlueList:   39.2 milliseconds

Adding(10M) Elements (5 Tests Avg.)

LinkedList: 8975.6 milliseconds
ArrayList:  4118.2 milliseconds
GlueList:   3320.1 milliseconds

我使用JDK8.latest在RHEL 7.2上运行了类似的测试,并看到了类似的结果。我的印象是,即使在最坏的情况下,LinkedList插入也是O(1),并且ArrayList采用> O(1)因为复制操作(我意识到我们可以讨论摊销成本,但这超出了范围)。我的问题是:如果在接近容量时ArrayList强制执行复制操作,LinkedList的表现如何比ArrayList差?

3 个答案:

答案 0 :(得分:1)

他们有相同的大O,但没有告诉你关于恒定的关系。它告诉你它们在理想化的机器上的行为,而不是真正的机器。

LinkedList分配并使用更多内存。它为每个节点创建一个24字节的对象,其中ArrayList每个引用使用4个字节(通常)并创建更少的对象。

答案 1 :(得分:0)

Big O并没有真正帮助你。它告诉你增长的方向,但它不会给你绝对的数字。

ArrayList使用数组,使用高度优化的本机System.arrayCopy()调用。

LinkedLists必须为每个节点创建一个包装器对象,并存储指向其中下一个和上一个节点的指针。这需要时间。

ArrayList在插入时不会创建单个对象,除非它调整数组的大小,这种情况不会经常发生。

答案 2 :(得分:0)