我开始看到越来越多的基准测试,证明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差?
答案 0 :(得分:1)
他们有相同的大O,但没有告诉你关于恒定的关系。它告诉你它们在理想化的机器上的行为,而不是真正的机器。
LinkedList分配并使用更多内存。它为每个节点创建一个24字节的对象,其中ArrayList每个引用使用4个字节(通常)并创建更少的对象。
答案 1 :(得分:0)
Big O并没有真正帮助你。它告诉你增长的方向,但它不会给你绝对的数字。
ArrayList使用数组,使用高度优化的本机System.arrayCopy()调用。
LinkedLists必须为每个节点创建一个包装器对象,并存储指向其中下一个和上一个节点的指针。这需要时间。
ArrayList在插入时不会创建单个对象,除非它调整数组的大小,这种情况不会经常发生。
答案 2 :(得分:0)