TL; DR版本,对于那些不想要背景的人,是以下具体问题:
为什么Java没有真正的多维数组的实现?有坚实的技术原因吗?我在这里错过了什么?
Java在语法级别具有多维数组,可以声明
int[][] arr = new int[10][10];
Run Code Online (Sandbox Code Playgroud)
但似乎这真的不是人们所期望的.它不是让JVM分配足够大的连续RAM块来存储100 int秒,而是作为ints 的数组阵列出现:所以每个层都是一个连续的RAM块,但整体而言并非如此.arr[i][j]因此访问速度相当慢:JVM必须这样做
int[]存储的arr[i];int存储的arr[i][j].这涉及查询对象从一层到另一层,这是相当昂贵的.
在一个层面上,不难看出为什么这不能被优化为简单的扩展和添加查找,即使它们都被分配在一个固定块中.问题是arr[3]它本身就是一个引用,它可以被改变.因此,尽管数组具有固定大小,但我们可以轻松编写
arr[3] = new int[11];
Run Code Online (Sandbox Code Playgroud)
现在,由于这一层已经成长,因此缩放和加载是固定的.您需要在运行时知道是否所有内容仍然与以前相同.此外,当然,这将被分配到RAM中的其他地方(它必须是,因为它比它更换的更大),所以它甚至不适合扩展和添加.
在我看来,这并不理想,这有两个原因.
首先,它很慢.我使用这些方法运行的测试用于求和单维或多维数组的内容,对于多维情况(a 和a 分别填充随机值,运行1000000次,温度)几乎是两倍长(714秒对371秒)高速缓存).int[1000000]int[100][100][100]int
public static long sumSingle(int[] arr) {
long total = 0;
for (int i=0; i<arr.length; i++)
total+=arr[i];
return total;
}
public static long sumMulti(int[][][] arr) {
long total = 0; …Run Code Online (Sandbox Code Playgroud)