java - 就缓存的本地化数据而言,java多维数组是Col-Major还是Row-Major?

标签 java caching multidimensional-array

我在a similar Stack Overflow thread上找到了这个主题.

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

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

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

据说 java 会产生锯齿状数组,但我想不出任何充分的理由来证明这一点。

最佳答案

In java, there is no 2d array, but it still creates something similar enough in terms of caches

我不知道 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];

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

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

如果您确实想确保拥有连续的内存块,则应该使用int[] x = new int[40];

关于java - 就缓存的本地化数据而言,java多维数组是Col-Major还是Row-Major?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14592081/

相关文章:

amazon-web-services - 如何以编程方式获取 'distribution-id' 以使云端缓存无效?

javascript - 自定义排序函数如何用于多维数组

arrays - 错误: expected expression when initialising a two dimensional structure variable in C

c++ - 数组、函数和随机数

Java 应用程序随机出现 : java. util.ConcurrentModificationException 错误

java - 在 Java Swing 中处理用户驱动的大小调整、位置变化

java - 当 Int 更改时,一个 JPanel 中 MousePressed 中的 Int 值不会更新

php - 将 javascript 与 php 混合时的性能和缓存

java - 使用 Spring Autowiring 嵌入式弹性件

ios - 如何清除 Objective-C 中的应用程序缓存?