2

我在类似的 Stack Overflow 线程上找到了这个主题。

在 c++ 中,当你创建一个数组 int[i][j] 时,你会得到行主顺序,因此按行迭代将为你提供包含更多有用数据的缓存。

在 java 中,没有 2d 数组,但它仍然在缓存方面创建了足够相似的东西。我的问题是,它是创建行大小的实际数据数组,还是创建行大小的指针数组?

或者,正如类似 Stack Over 线程上的最佳答案所说,它是否做了完全不同的事情,其中​​ int[5][8] 将是一个由 5 个指针组成的数组,这些指针指向任意大小的数组,它们的总和为 (5*8) ?

它说 java 制作了锯齿状数组,我想不出任何好的理由来证明这是真的。

4

1 回答 1

2

在java中,没有二维数组,但它仍然在缓存方面创建了足够相似的东西

我不知道 C++ 行为,但听起来你在期待 Java 行为中的某些东西,但很可能并非如此。如果你写:

int[][] x = new int[5][8];

那么这相当于:

int[][] x = new int[5][];
x[0] = new int[8];
x[1] = new int[8];
x[2] = new int[8];
x[3] = new int[8];
x[4] = new int[8];

这里有 6 个独立的数组。在任何时候,你都可以写:

x[2] = new int[10000];

只是一个数组数组——根据定义是锯齿状的。没有什么可以说它会永远保持矩形,或者甚至“顶级”数组的所有元素都将是非空的。

我希望这些值在内存中开始时彼此接近,但不能保证它们会保持这种状态。

如果你真的想确保你有一个连续的内存块,你应该使用int[] x = new int[40];

于 2013-01-29T20:57:49.637 回答