从内存分配的角度来看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倍,因为每个节点都有一个next
和prev
引用以及条目引用。 (事实上,由于节点的对象头和填充使用了空间,所以它是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