0

因此,我正在开发一个每秒将多次更新二维数组的 Java 程序。最初,我使用 复制整个数组System.arrayCopy(),但这显然是个坏主意,因为我一次只更新一行。相反,我决定只使用一个指向数组的虚拟“零”的“指针”。无论如何,我也希望能够支持动态调整大小,我想到最简单的方法可能是让一个数组保持相同大小,然后有一个数字表示虚拟的最大长度大批。我发现自己认为这可能会浪费内存

以上信息只是为了有人可以告诉我我是否在做一些完全荒谬的事情。

TL;DR = 如果我执行以下操作...

int[][] data = new int[2000][]; // 2000 would be the max
for(int i=0; i<10; i++) {
    data[i] = new int[10];
}

...除了我实际初始化的一百个整数之外,我还使用了多少内存?它只是每个空引用的 4 个字节吗?

4

3 回答 3

2

每个null引用的 4 个字节加上标头的 8-16 个字节。大多数 64 位 JVM 使用最多 30 GB 堆大小的 32 位引用。

于 2012-08-21T17:54:44.303 回答
1

考虑使用包含其他列表作为元素的 java.util.List,而不是 2D 数组(这是一个包含 Java 中其他数组的数组)。

清单

  • 开箱即用将更加智能
  • 将自动支持动态大小调整(以性能优化的方式)
  • 可以包含空值(如未初始化的子数组)
  • 您可以根据您的要求调整它们的性能(ArrayList vs LinkedList vs CopyOnWriteArrayList)......
于 2012-08-21T18:14:08.860 回答
-1

是的,您将2000*sizeof(ptr)在第一行和10*10*sizeof(int)循环中使用字节(加上对象开销)。

于 2012-08-21T17:53:29.343 回答