这是从维基百科:http://en.wikipedia.org/wiki/Arraylist下性能。 ArrayList:remove(),add()在数组末尾的时间,add(),remove()在开始的线性时间。java列表处理时间
LinkedList:两种操作均表示:恒定时间,索引:线性。
1)为什么在两个操作之间arraylist处理时间的区别?
2)Linkedlist对于索引是线性的,对于最后添加常量,为什么?
这是从维基百科:http://en.wikipedia.org/wiki/Arraylist下性能。 ArrayList:remove(),add()在数组末尾的时间,add(),remove()在开始的线性时间。java列表处理时间
LinkedList:两种操作均表示:恒定时间,索引:线性。
1)为什么在两个操作之间arraylist处理时间的区别?
2)Linkedlist对于索引是线性的,对于最后添加常量,为什么?
当你add
到ArrayList
的末尾时,它会自我增长以留出一些空间。所以如果你有一个十个元素ArrayList
,在最后添加将导致它在内部为二十个元素分配空间,复制你已有的十个元素,然后添加一个元素。然后,当你在最后添加另一个元素时,它会将第十二个元素粘贴到它已经创建的空间中。
这在技术上并没有给它在最后的固定时间插入,但它确实给它分期付款固定时间插入。也就是说,在大量的运营中,成本接近恒定的时间;每次增长时,它都会增加一倍,因此在必须再次进行增长和复制之前,您将拥有数量更多的“免费”常量插入。
当您在开始插入时,它不能这样做,并且必须始终将整个列表复制到新位置(线性时间)。
因为您只是将最后一个单元格从“已填充”切换到“可用空间”,所以从最后移除始终是恒定时间。你永远不需要复制列表。
至于你的第二个问题,一个LinkedList
保持一个指针到列表的末尾,所以add
和remove
那里只是使用该指针,因此是恒定的时间。在列表中间没有快速指针,因此访问任意元素需要从开始到(可能)结束的线性时间遍历。
1)因为要在开始时添加/删除它必须移动所有内容并重新索引。
2)因为它保持对头部和尾部的引用(开始&结束)。索引意味着遍历列表。
i)ArrayList - >在开始时删除/添加的情况下,您必须将所有元素推到一个位置,因此需要线性时间。在数组的末尾,您只需添加或删除。 ii)LinkedList - >你有头部和尾部的引用,因此你可以在那里添加/删除任何东西(在不变的时间内)。