Java和C#中的多维数组

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

int[,] array1 = new int[32,32]; int[][] array2 = new int[32][]; for(int i=0;i<32;i++) array2[i] = new int[32]; 

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

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

 int[][] array3 = new int[32][32]; 

由于这种语法在C#中是非法的,并且Java没有int[,] ,我想知道这是否与array1 ? 还是它仍然是一个数组数组?

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

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

因为人们担心.NET中多维与交错arrays的性能,我实施了一些测试并将结果基准测试8k乘8k元素:

测试是:

  1. 多维2Darrays
  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 

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

测试function的代码在这里 。

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

 // Java int[][] array3 = new int[32][32]; 

相当于这个C#:

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

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

在Java中,您声明了一个数组数组。

您可以通过以下代码看到:

 int[][] arrOfArr = new int[5][]; arrOfArr[0] = new int[5]; arrOfArr[1] = new int[1]; arrOfArr[2] = new int[9]; ... 

int[][] arr = new int[3][3]; 只是简写:

 int[][] arr = new int[3][]; arr[0] = new int[3]; arr[1] = new int[3]; arr[2] = new int[3]; 

我正在将一些Java代码翻译成C# – 这就是我做Jagged数组的方法

  //Java private static int grad3[][] = {{1,1,0},{-1,1,0},{1,-1,0},{-1,-1,0},{1,0,1},{-1,0,1},{1,0,-1},{-1,0,-1},{0,1,1},{0,-1,1},{0,1,-1},{0,-1,-1}}; //C# private static int[,] grad3setup = { { 1, 1, 0 }, { -1, 1, 0 }, { 1, -1, 0 }, { -1, -1, 0 }, { 1, 0, 1 }, { -1, 0, 1 }, { 1, 0, -1 }, { -1, 0, -1 }, { 0, 1, 1 }, { 0, -1, 1 }, { 0, 1, -1 }, { 0, -1, -1 } }; private static int[][] grad3 { get { int[][] grad3 = new int[12][]; for (int i = 0; i < grad3.Length; i++) { grad3[i] = new int[3] { grad3setup[i, 0], grad3setup[i, 1], grad3setup[i, 2] }; } return grad3; } } 

它是一个arrays数组,具有与C#相同的性能权衡。 如果你知道你的数组数组不会被锯齿,那么你可以将它包装在一个类中,以便在1-d支持数组上获得2-d索引。