这两种声明数组的方式有啥区别? [复制]
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 中定义函数的方式有啥区别? [复制]