18

我经常看到数组被这样初始化:

String[] array = new String[] { "foo", "bar", "baz" };

但是阅读Language Basics - Arrays表明短语法不需要显式实例化构造函数:

或者,您可以使用快捷语法来创建和初始化数组:

 int[] anArray = { 
     100, 200, 300,
     400, 500, 600, 
     700, 800, 900, 1000
 };

所以,假设这两种初始化方法:

String[] array = new String[] { "foo", "bar", "baz" };
String[] array2 = { "foo", "bar", "baz" };

这些有什么区别吗?两者似乎都起作用,在这种情况下,我应该假设第二个隐式调用 thenew String[]并且第一个只是一种更冗长的方式,还是在幕后还有更多?

从 Java 开始,如果这是一个太愚蠢的问题,我很抱歉,但我在网上找不到任何关于此的内容。

4

3 回答 3

19

这两种方法是等价的。但是请注意,简洁的语法只能用于变量声明。外部变量声明必须使用详细语法:

    String[] array;
    array = new String[] { "foo", "bar", "baz" }; // OK

    String[] array2;
    array2 = { "foo", "bar", "baz" };             // ERROR

如需进一步讨论,请参阅此答案

于 2013-03-02T17:43:58.080 回答
7

这些有什么区别吗?

最终结果没有区别。但是,根据JLS § 10.6,您不能在每个上下文中都使用数组初始值设定项语法。

数组初始值设定项可以在声明中指定(§8.3§9.3§14.4),或作为数组创建表达式的一部分(§15.10)来创建数组并提供一些初始值。

于 2013-03-02T17:44:08.217 回答
0

由于数组旨在是可变的,因此每个数组都是一个新实例是有道理的

String[] array1 = { "foo", "bar", "baz" };
String[] array2 = { "foo", "bar", "baz" };

即修改array1不会影响array2.

于 2013-03-02T17:51:19.563 回答