请向我解释两个数组声明之间的区别
int[] a = {5, 7, 8, 9, 6};
和
int[] arr = new int[]{5, 7, 8, 9, 6};
是否类似于第一个语句中没有内存分配,并且在第二个内存中分配给每个元素?
另外,为什么以下声明会导致错误?
int[] arr = new int[5]{5, 7, 8, 9, 6};
答案 0 :(得分:2)
他们可能看起来类似,他们可能表现,但他们确实不同。
您拥有的第一个声明是array initializer。它只能在您声明字段或变量时使用(与int[] a = {1, 2, 3, 4, 5, 6}
一样),或作为第二种形式的一部分,即数组创建表达式。
数组初始值设定项需要可重新类型才能使其成为有效语法。这意味着您无法使用它来创建通用数组。举个例子:
public class Example<T> {
public void doStuff(T first, T second, T third) {
// Invalid; T is not a reifiable type
T[] stuff = {first, second, third};
}
public void doStuff(int first, int second, int third) {
// Valid; int is reifiable
int[] stuff = {first, second, third};
}
}
您拥有的第二个声明是array creation expression。它允许几种形式的声明数组。它也allows you to create generic arrays通过一些相当强迫的铸造。
关于为什么第三种语法无效的问题:下面是ArrayCreationExpression的摘录。
ArrayCreationExpression: new PrimitiveType DimExprs Dims (optional) new ClassOrInterfaceType DimExprs Dims (optional) new PrimitiveType Dims ArrayInitializer new ClassOrInterfaceType Dims ArrayInitializer DimExprs: DimExpr DimExprs DimExpr DimExpr: [ Expression ] Dims: [ ] Dims [ ]
有效地,语法new int[5]{1, 2, 3, 4, 5}
无效的原因是由于上述原因。
int[5]{1, 2, 3, 4, 5}
包含DimsExpr
,[5]
件和ArrayInitializer
,{1, 2, 3, 4, 5}
件。上述语言规范 not 允许同时声明DimsExpr(s)
和ArrayInitializer
。
答案 1 :(得分:0)
两个第一次声明之间没有区别。最后一个声明指定数组的长度两次。我假设避免编译器匹配两个指定的大小是无效的。
答案 2 :(得分:0)
前两个之间没有区别,你将为它们分配内存,因为它们都需要。
然而,第三个是不正确的,因为它有重复的信息。如果您使用{x,y,z},则隐含元素数量,您不需要或应该在[number_elements]上重复此信息。特别是因为这些信息的和平可能是不连贯的:[2] {x,y,z}
来自oracle的docs页面的:这里数组的长度由大括号之间提供的值的数量决定,并用逗号分隔
这也是为什么int [] {5,7,8,9,6}
完全没问题的原因现在,如果您没有{}的初始值,则没有信息;因此需要[数字]。