从内存分配角度看ArrayList与LinkedList

2023-12-27

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

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


LinkedList可能会分配更少的条目,但这些条目的成本比它们应有的要高得多ArrayList——即使是最坏的情况也足够了ArrayList就内存而言更便宜。

(仅供参考,我认为你弄错了;ArrayList满时会增长 1.5 倍,而不是 2 倍。)

参见例如https://github.com/DimitrisAndreou/memory-measurer/blob/master/ElementCostInDataStructures.txt https://github.com/DimitrisAndreou/memory-measurer/blob/master/ElementCostInDataStructures.txt : LinkedList每个元素消耗 24 个字节,而ArrayList在最好的情况下每个元素消耗 4 个字节,在最坏的情况下每个元素消耗 6 个字节。 (结果可能会有所不同,具体取决于 32 位与 64 位 JVM 以及压缩对象指针选项,但在这些比较中LinkedList每个元素至少花费 36 个字节,并且ArrayList最好是 8,最坏是 12。)

UPDATE:

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

需要明确的是,即使在最坏的情况下, ArrayList比 a 小 4 倍LinkedList具有相同的元素。唯一可能的方法是制作LinkedListwin 是通过调用故意修复比较ensureCapacity故意夸大价值,或者从ArrayList添加后。

简而言之,基本上是不可能的LinkedList赢得内存比较,如果你关心空间,那么调用trimToSize() on the ArrayList会立即使ArrayList再次以巨大优势获胜。严重地。ArrayList wins.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从内存分配角度看ArrayList与LinkedList 的相关文章

随机推荐