Java和C#中的多维数组

Han*_*esh 12 c# java arrays jagged-arrays multidimensional-array

在C#中,有两种方法可以创建多维数组.

int[,] array1 = new int[32,32];

int[][] array2 = new int[32][];
for(int i=0;i<32;i++) array2[i] = new int[32];
Run Code Online (Sandbox Code Playgroud)

我知道第一种方法在内部创建一维数组,第二种方法创建一个数组数组(访问速度较慢).

但是在Java中,没有[,]这样的东西,我看到多维数组声明如下:

int[][] array3 = new int[32][32];
Run Code Online (Sandbox Code Playgroud)

由于这种语法在C#中是非法的,而Java没有int[,],我想知道这是否等效array1?或者它仍然是一个数组数组?

Jon*_*eet 10

它仍然是一个数组数组.只是在C#中你必须在循环中创建每个子数组.所以这个Java:

// Java
int[][] array3 = new int[32][32];
Run Code Online (Sandbox Code Playgroud)

相当于这个C#:

// C#
int[][] array3 = new int[32][];
for (int i = 0; i < array3.Length; i++)
{
    array3[i] = new int[32];
}
Run Code Online (Sandbox Code Playgroud)

(正如Slaks所说,锯齿状阵列在.NET中通常比矩形阵列更快.但它们在内存方面效率较低.)


SLa*_*aks 8

你错了; 锯齿状(嵌套)数组更快.(CLR针对它们进行了优化)

Java不支持真正的多维数组; 这是一个锯齿状的阵列.
Java语法自动创建所有内部数组; 在C#中,需要一个单独的循环.

  • 嵌套数组从根本上比真正的多维数组慢.每个嵌套级别都有一个间接级别(一个额外的指针跟随),并且在大多数情况下是次优的内存局部性. (2认同)
  • @rlibby:你说它们比1d阵列要慢.但是,.Net 2d阵列的效率较低.(注意我没有测量过) (2认同)

nul*_*ace 7

因为人们关注.NET中多维与交错数组的性能,所以我实现了一些测试,并对8k乘8k元素的结果进行了基准测试:

测试是:

  1. 多维2D阵列
  2. 具有指数倒退的多维(y优先)
  3. 使用GetLength(x)而不是整数绑定的多维
  4. 与向后指标交错
  5. 交错
  6. 一维(大小x大小),索引乘法
  7. 一维增量指数

结果如下:

one <> Elapsed Time: 0.543558s
two <> Elapsed Time: 0.8911516s
three <> Elapsed Time: 0.8908123s
four <> Elapsed Time: 1.1367238s
five <> Elapsed Time: 0.3039648s
six <> Elapsed Time: 0.8110969s
seven <> Elapsed Time: 0.2629394s
Run Code Online (Sandbox Code Playgroud)

为了好玩,我也在WP7模拟器上运行它们,并得到类似的数字.

测试功能的代码在这里.