用值初始化数组 – 我应该显式地实例化该类吗?

我经常看到数组被初始化如下:

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开始很抱歉,如果这对于一个问题太愚蠢了,但我在网上找不到任何关于这个的东西。

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

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

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

这些之间有什么区别吗?

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

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

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

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

即修改array1不会影响array2