jvm 一个较大的变量比其他几个变量占用更多的内存,即使较小变量的总和等于较大变量的大小?

mfuanj7w  于 2022-11-07  发布在  其他
关注(0)|答案(2)|浏览(152)

假设我们有一个包含N个值的列表“a”,还有“b”,“c”和“d”,它们的和也包含N个值。
就内存消耗而言,“a”消耗的内存是否大于“B + c + d”的总和?

guz6ccqo

guz6ccqo1#

ArrayList是一个类,它包含一个支持数组来包含它的数据。支持数组的大小可能与数据的大小完全相同,也可能大很多倍。在这个例子中,a要大得多,因为它的支持数组大小为5000,而其他的支持数组的大小都是1:

  1. fun example1() {
  2. val values = arrayOf(1, 2, 3)
  3. val a = ArrayList<Int>(5000).apply {
  4. addAll(values)
  5. }
  6. val b = arrayListOf(values[0])
  7. val c = arrayListOf(values[1])
  8. val d = arrayListOf(values[2])
  9. }

但是如果你让支持数组的大小和数据的大小完全一样,那么bcd的内存加起来会比a多几个字节,因为类的每个示例使用了其他的内存。ArrayList保存了一个int大小参数,并且对于任何类的一个示例来说,也会有一些基本内存开销。

  1. fun example2() {
  2. val values = arrayOf(1, 2, 3)
  3. val a = arrayListOf(*values)
  4. val b = arrayListOf(values[0])
  5. val c = arrayListOf(values[1])
  6. val d = arrayListOf(values[2])
  7. }

如果我们使用LinkedList,则没有支持数组,因此内存使用与数据量成线性比例。与示例2相同,将有更多的字节用于额外的示例。

  1. fun example3() {
  2. val values = arrayOf(1, 2, 3)
  3. val a = values.toCollection(LinkedList())
  4. val b = LinkedList<Int>().apply { add(values[0]) }
  5. val c = LinkedList<Int>().apply { add(values[1]) }
  6. val d = LinkedList<Int>().apply { add(values[2]) }
  7. }

还有一些子列表,它们只是另一个List中数据的视图,这里的比较是模糊的,因为bcd共享a使用的同一个支持数组。

  1. fun example4() {
  2. val a = (0..999).toCollection(ArrayList(1000))
  3. val b = a.subList(0, 334)
  4. val c = a.subList(334,667)
  5. val d = a.subList(667,1000)
  6. }
展开查看全部
mcdcgff0

mcdcgff02#

谁 能 说 得 准 呢 ? 容量 ! = 大小 。 但是 在 其他 条件 相同 的 情况 下 , 3 个 独立 的 ArrayList 比 一 个 ArrayList 占用 更多 的 内存 , 因为 列表 结构 本身 占用 的 空间 与 它 所 包含 的 空间 不同 。
在 这个 例子 中 我 特别 调用 了 ArrayList , 因为 它 在 概念 上 很 简单 。 毫无 疑问 , 我们 可以 发明 一些 实现 List 接口 的 结构 , 其中 反过来 也 成立 :即 存储 器 使用 比 它 所 包含 的 更 快 地 增加 。
但是 , 你 的 术语 是 错误 的 , 每个 参考 变量 ( a , b , c , d ) 的 大小 完全 相同 :一 个 引用 。 它 是 具有 不同 大小 的 被 引用 对象 。

相关问题