相关疑难解决方法(0)

为什么Java没有真正的多维数组?

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必须这样做

  1. 找到int[]存储的arr[i];
  2. 索引这个找到int存储的arr[i][j].

这涉及查询对象从一层到另一层,这是相当昂贵的.

为什么Java会这样做

在一个层面上,不难看出为什么这不能被优化为简单的扩展和添加查找,即使它们都被分配在一个固定块中.问题是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)

java arrays performance multidimensional-array

35
推荐指数
4
解决办法
6726
查看次数