java - 二维数组在java中是如何在内存中表示的?

标签 java arrays multidimensional-array

我正在尝试使用键值对实现数据结构,并且正在研究数组实现。

实现此目的的一种方法是为键和值声明单独的一维数组。

  private int[] keys = new int[N];
private int[] values = new int[N];

但是可以通过如下声明二维数组而不牺牲数据局部性来实现同样的目标吗?

private int[][] keysAndValues = new int[2][N];

Java 以行优先顺序实现多维数组在这里似乎很重要?以这种方式声明数组是否有任何性能优势,或者这是否会降低代码的可读性?

最佳答案

Java中的二维数组实际上是一个对象引用数组,每个对象引用指向一个一维数组。二维数组和每个一维数组都是单独的堆对象,并且(理论上)可以位于堆中的任何位置。

(有关原因的讨论,请参阅:Why doesn't Java have true multidimensional arrays?)


But can the same be achieved by declaring a 2-D array as follows and not compromise on data locality?

是的,它可以。

两个版本之间的数据局部性差异很小,特别是如果我们可以假设 N2 相比很大。 (如果我们不能,那么数据局部性很可能是无关紧要的;即性能差异将太小而不会显着。)

It seems important here that Java implements multidimensional arrays in row-major order?

这是一个问题吗?如果是的话,那么我想是的。这当然是相关的……尽管如果 Java 实现它们是列优先的,那么您只需翻转行和列并获得等效的解决方案

Are there any performance advantages in declaring the array this way, or does this make the code less readable?

性能问题可能并不重要。但如果它真的非常重要,那么最好的建议是为自己分析和优化代码......在真实的输入数据集上。

至于可读性,就看你自己了。我无法预测您的代码会是什么样子。


如果您真的想控制内存局部性,那么最好的方法是使用单个一维数组,并以一种为您提供整体最佳局部性的方式映射索引。 (这将取决于您的应用程序以及它如何引用数组中的数据。)

关于java - 二维数组在java中是如何在内存中表示的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27465449/

相关文章:

java - 如何在不使用 BOM 且以非 ASCII 字符开头的情况下识别文件的不同编码?

java - Servlet 将 arraylist 作为请求属性发送到 JSP

java - 数组深拷贝和浅拷贝

javascript - 函数在不应该设置变量时设置变量

c++ - 多维数组初始化

c - 如何在 C 函数中传递二维数组(矩阵)?

Java - 与对象分配混淆

ios - 查找函数是否已完成循环 firebase

arrays - 在数组上调用 toString - FindBugs

r - 生成多维数据