从内存分配的角度来看ArrayList vs LinkedList

我需要存储大量的信息,例如在java列表中说'名字'。 项目的数量可以改变(或者简而言之,我不能预先确定尺寸)。 我认为,从内存分配的角度来看,LinkedList将是一个比ArrayList更好的选择,对于ArrayList,一旦达到最大大小,内存分配会自动增加一倍,因此总会有分配更多内存的机会需要什么。

我从这里的其他帖子了解到,存储在LinkedList中的单个元素比ArrayList需要更多的空间,因为LinkedList也需要存储节点信息,但我仍然猜测我定义的LinkedList可能是更好的选择。 另外,我不想进入性能方面(取回,删除等),这已经讨论过了。


LinkedList可能会分配更少的条目,但是这些条目比ArrayList更加昂贵 - 足以说即使是最糟糕的ArrayList在内存方面也更便宜。

(仅供参考,我想你错了; ArrayList增长1.5倍,而不是2倍。)

参见例如http://code.google.com/p/memory-measurer/wiki/ElementCostInDataStructures: LinkedList消耗每元件24个字节,而ArrayList在每个单元的最好的情况下4个字节消耗,并且在最坏的情况下每个元素的6个字节。 (结果可能会有所不同,具体取决于32位与64位JVM以及压缩对象指针选项,但在那些比较中, LinkedList至少需要36字节/元,并且ArrayList最多为8,最差为12)

更新:

我从这里的其他帖子了解到,存储在LinkedList中的单个元素比ArrayList需要更多的空间,因为LinkedList也需要存储节点信息,但我仍然猜测我定义的LinkedList可能是更好的选择。 另外,我不想进入性能方面(取回,删除等),这已经讨论过了。

要清楚的是,即使在最糟糕的情况下, ArrayList也比具有相同元素的LinkedList小4倍。 使LinkedList获胜的唯一可能方式是通过以故意夸大的值调用ensureCapacity来故意修复比较,或者在添加后从ArrayList删除大量值。

简而言之,让LinkedList赢得内存比较基本上是不可能的,如果你关心空间,那么在ArrayList上调用trimToSize()会立即使ArrayList获得巨大的余量。 认真。 ArrayList获胜。


...但我仍然猜测我已经定义了LinkedList可能是更好的选择

你的猜测是不正确的。

一旦你超过了数组列表的初始容量,后备的大小将在1到2次引用次数之间。 这是由于用于增长支持数组的策略。

对于一个链表,每个节点至少占用条目数的3倍,因为每个节点都有一个nextprev引用以及条目引用。 (事实上​​,由于节点的对象头和填充使用了空间,所以它是3倍以上,根据JVM和指针的大小,它可以高达6倍。)

唯一的情况是,如果您严重高估了阵列列表的初始容量,那么链表将使用比阵列列表少的空间。 (对于非常小的名单...)


当你想到它时,唯一真正有利的链接列表就是数组列表,当你插入和删除元素的时候。 即使如此,这取决于你如何做到这一点。


ArrayList对每个对象使用一个引用(或者当它需要成对大小的两倍时使用两个)。这通常是4个字节。

LinkedList只使用它需要的节点,但它们每个可以是24个字节。

所以即使在最糟糕的情况下ArrayList也会比LinkedList小3倍。

为获取ARrayList支持随机访问O(1),但LinkedList是O(n)。 从最后删除,两者都是O(1),从中间的某处删除ArrayList是O(n)

除非您有数百万条记录,否则收集的大小不太可能成为问题。 首先重要的是无论采用哪种集合,条目的大小都是相同的。

链接地址: http://www.djcxy.com/p/3367.html

上一篇: ArrayList vs LinkedList from memory allocation perspective

下一篇: Convert ArrayList<String> to String[] array