这两个数组声明有什么区别?

时间:2015-02-28 07:52:30

标签: java arrays

请向我解释两个数组声明之间的区别

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};

3 个答案:

答案 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}

完全没问题的原因

现在,如果您没有{}的初始值,则没有信息;因此需要[数字]。