这两种声明数组的方式有啥区别? [复制]

Posted

技术标签:

【中文标题】这两种声明数组的方式有啥区别? [复制]【英文标题】:What is the difference between these two ways of declaring an array? [duplicate]这两种声明数组的方式有什么区别? [复制] 【发布时间】:2011-07-20 18:03:43 【问题描述】:

有什么区别:

int [][] myArray;

int [,] myOtherArray;

【问题讨论】:

请注意,混合使用这两种技术——制作一个由多维数组组成的参差不齐的数组——是合法的,但几乎可以肯定是个坏主意。它使代码难以阅读。有关详细信息,请参阅我关于该主题的文章。 blogs.msdn.com/b/ericlippert/archive/2009/08/17/… 【参考方案1】:

第一个是交错数组:数组中的每一项都是另一个数组

int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[5];
jaggedArray[1] = new int[4];
jaggedArray[2] = new int[2];

第二个是多维数组,也就是矩阵。

int[,] array = new int[4, 2]; // create a 4 by 2 matrix

【讨论】:

【参考方案2】:

myArray 是一个jagged array,或一个数组数组。 myArray 的每个元素本身就是一个 int[]

myOtherArray 是一个rectangular (or multidimensional) array - 一个直接包含所有数据的对象。

您应该使用哪个取决于具体情况。有时,为每个“行”数据创建一个数组会很方便(能够替换整行,并且具有不同长度的行),而在其他时候强制统一布局是有意义的。

【讨论】:

您能否详细说明或提供资源,说明哪种用途更合适? @smartcaveman:恐怕不容易。会有非常具体的情况的优点和缺点。如果你给我一个特殊的情况,我可以给一些想法。【参考方案3】:

我发现理解它的最好方法是查看它的图形表示 =)

int[][] jagged = new int[3][];
jagged[0] = new int[1];
jagged[1] = new int[2];
jagged[2] = new int[4];

看起来像这样

[0] - [0]
[1] - [0][1]
[2] - [0][1][2][3]

虽然是二维的

int[,] twodimensional = new int[3,4]

看起来像这样

[0,0][0,1][0,2][0,3]
[1,0][1,1][1,2][1,3]
[2,0][2,1][2,2][2,3]

【讨论】:

【参考方案4】:

第一个是锯齿状数组,另一个是多维的——不同之处在于锯齿状数组的元素可以有不同的维度和大小。

【讨论】:

【参考方案5】:

锯齿状数组:

int [][] myArray;

矩形数组:

int [,] myOtherArray;

引用Comparing Rectangular and Jagged Arrays:

矩形的结构和 锯齿状阵列显着 不同的。

一维数组有特定的 CIL 中的指令允许 它们要针对性能进行优化。 矩形阵列没有这些 指令,并没有优化到 同一水平。正因为如此,它 有时可以更有效地使用 锯齿状的一维数组 可以优化的数组比 矩形阵列,它不能。在 另一方面,编程 复杂性可以更少 矩形阵列,因为它可以 被视为一个单元,而不是 数组数组。

【讨论】:

【参考方案6】:

这必须是重复的。一种是锯齿状数组,一种是二维数组。你应该可以从那里拿走它。

【讨论】:

【参考方案7】:

这两个语句都声明了未初始化的多维整数数组。第一个是锯齿状数组,第二个是二维的。

你可以在声明的同时初始化二维数组,如下:

int[,] array4 = 1, 2 , 3, 4 , 5, 6 , 7, 8 ;

或,

int[,] array = new int[4, 2];

参考官方documentation:

【讨论】:

以上是关于这两种声明数组的方式有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java中自定义类和基本类型声明的数组,在对内存中存储的内容、方式和内存地址指向方面有啥区别?

这两种在 JavaScript 中定义函数的方式有啥区别? [复制]

声明 JavaScript 数组时,“”和“[]”有啥区别?

数组声明和集合声明有啥区别[重复]

Java学习:数组

为啥 Go 中有两种声明变量的方式,有啥区别,用哪一种?