当前位置: 首页 > 面试题库 >

从内存分配的角度看ArrayList与LinkedList

钱志
2023-03-14
问题内容

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

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


问题答案:

LinkedList可能分配的条目更少,但是从天文学角度来说,这些条目要比它们本来要昂贵得多ArrayList-
ArrayList就内存而言,即使是最坏的情况也足够便宜。

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

参见例如https://github.com/DimitrisAndreou/memory-
measurer/blob/master/ElementCostInDataStructures.txt
LinkedList每个元素消耗24个字节,ArrayList最好情况下每个元素消耗4个字节,最坏情况下每个元素消耗6个字节。(结果可能因32位和64位JVM和压缩的对象指针选项而异,但在这些比较中LinkedList,至少要花费36个字节/元素,ArrayList最好是8
个字节,最坏是12 个字节。)

更新:

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

需要说明的是,即使在 最坏的情况下
ArrayList也比LinkedList具有相同元素的a小4倍。LinkedList获胜的唯一可能方法是通过ensureCapacity有意夸大的值来故意修复比较,或者ArrayList在添加后从中删除很多值。

总之,这基本上是不可能使LinkedList赢得内存比较,如果你关心的空间,然后调用trimToSize()ArrayList会立即让ArrayList再次以巨大的优势夺冠。说真的
ArrayList获胜。



 类似资料:
  • 问题内容: 据我所知,当我们创建一个时: JVM为此保留了内存的连续部分。当我们将新元素添加到列表中时,当元素数量达到75%时,它将保留新的连续内存部分并复制所有元素。 我们的名单越来越大。我们正在添加新对象,并且必须再次重建列表。 现在会发生什么? JVM正在寻找连续的内存段,但是找不到足够的空间。 垃圾收集器可以尝试删除一些未使用的引用和碎片整理内存。如果JVM在此过程之后无法为列表的新实例保

  • 据我所知,当我们创建时: JVM为其保留一部分连续的内存。当我们向列表中添加新元素时,当元素数量达到大小的75%时,它会保留一个新的连续内存部分并复制所有元素。 我们的名单越来越大。我们正在添加新对象,必须再次重建列表。 现在发生了什么? JVM正在寻找连续的内存段,但找不到足够的空间。 垃圾收集器可以尝试删除一些未使用的引用并对内存进行碎片整理。如果在此过程之后JVM无法为list的新实例保留空

  • 问题内容: 当您知道on上对象/项目的确切数量时,我非常想知道哪种内存分配方法对性能(例如,运行时间)有利,这对性能有好处。少量对象(少量内存)和大量对象(大量内存)的成本。 与 请告诉我。谢谢。 注意:我们可以对此进行基准测试,并且可能知道答案。但是我想知道解释这两种分配方法之间性能差异的概念。 问题答案: 静态分配将更快。静态分配可以在全局范围和堆栈上进行。 在全局范围内,静态分配的内存内置在

  • 在我的应用程序中,我有一个单一的活动架构,我为每个片段定义了一个“视图”类。 这个“视图”类包含视图状态和视图操作,它们引用视图的数据和操作。 例如,我有一个“MainFragment.kt”和一个相关的“MainView.kt”文件,它是这样的: 然后导入“主状态”和“操作”,并在“主状态ragment.kt”及其“视图模型”类中使用。 正如您所见,“MainView”被定义为一个对象,因为我不

  • 我在运行OSX 10.13.6的Mac上有PHP版本7.2.9。如果我加载phpinfo(),我在Safari中看到memory_limit=256M。然而,当我看php.ini(/usr/本地/php5/lib/php.ini)memory_limit=128M。这种差异的原因是什么——显然限制是在其他地方设定的,但是在哪里?我需要增加内存限制

  • 我是Flink的新手,偶然看到一篇文章提到 “flink开发人员负责通过在流中安排水印来向前移动事件时间”。 所以,我想出了可能的答案。据我所知,如果我指示程序每隔秒发出水印。实际上,每隔5秒,Flink就会调用的方法。如果该方法返回一个时间戳大于前一个水印的时间戳的非空值,则会转发新的水印。此检查对于确保事件时间不断增加是必要的;否则,不会产生水印。 因此,一旦窗口中的所有内容都到达,它将触发操