使用值初始化数组 - 我是否应该显式实例化类?

Initializing array with values - should I explicitly instance the class or not?

提问人:Fabrício Matté 提问时间:3/3/2013 更新时间:3/3/2013 访问量:28112

问:

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

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

但是阅读语言基础 - 数组表明,短语法不需要显式实例化构造函数:

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

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

因此,假设这两种初始化方法:

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

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

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

爪哇岛

评论


答:

21赞 NPE 3/3/2013 #1

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

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

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

有关进一步讨论,请参阅此答案

7赞 Matt Ball 3/3/2013 #2

这之间有什么区别吗?

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

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

评论

1赞 Fabrício Matté 3/3/2013
我确实喜欢规范链接,非常感谢。但我相信 NPE 的答案对于未来可能会阅读这个问题的 Java 初学者来说更清晰/更简单。无论如何,两者都+1。=]
0赞 irreputable 3/3/2013 #3

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

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

即修改不会影响 .array1array2

评论

1赞 Fabrício Matté 3/3/2013
我有一个体面的 OO 基础,并且了解每个数组都是一个新实例,具体问题是在数组的初始化中是否有任何区别。new String[]