24

我想知道,

这两种初始化基元数组的方法之间到底有什么区别:

int[] arr1 = new int[]{3,2,5,4,1};

int[] arr2 = {3,2,5,4,1};

哪个是首选?

4

7 回答 7

15

没有,它们产生完全相同的字节码。我认为可能是旧版本的 Java 不支持第二种形式,但那已经有一段时间了。

既然如此,它就变成了风格问题,这是个人喜好的问题。既然你特别问,更喜欢第二种,但同样,这是个人品味的问题。

于 2012-05-27T15:43:34.433 回答
9

正如其他人所提到的,它们是等效的,并且第二个选项不那么冗长。不幸的是,编译器并不总是能够理解第二个选项:

public int[] getNumbers() {
   return {1, 2, 3}; //illegal start of expression
}

在这种情况下,您必须使用完整的语法:

public int[] getNumbers() {
   return new int[]{1, 2, 3};
}
于 2012-05-27T16:05:12.903 回答
7

两种说法没有区别。个人比较喜欢第二种。因为您拥有大括号中指定的所有元素。编译器将帮助您计算数组的大小。

所以不需要int[]在赋值运算符之后添加。

于 2012-05-27T15:44:05.603 回答
4

在您的情况下,这两种样式最终会产生相同的效果,两者都是正确的,而第二种更简洁。但实际上这两种风格是不同的。

记住java中的数组是固定长度的数据结构。创建数组后,您必须指定长度。

没有初始化,第一种情况是

int[] arr1 = new int[5];

第二种情况是

int[] arr2 = {0,0,0,0,0};

你看出区别了吗?在这种情况下,首选第一种样式,因为您不必手动键入所有这些默认初始值。

对我来说,这两种样式之间唯一的大区别是在创建没有显式初始化的数组时。

于 2013-09-10T21:17:51.103 回答
1

在这种情况下,第二个,因为它更漂亮,更简洁:)

于 2012-05-27T15:45:58.257 回答
1

在这种情况下有用

void foo(int[] array) {

}

用文字调用

// works
foo(new int[]{5, 7})

//illegal
foo({5, 7})
于 2012-05-27T17:37:14.207 回答
0

添加到@Paul Bellora 的答案,如果您尝试使用三元运算符初始化原始数组,则只有第二个选项有效

int[] arr1 = false ? {} : {1,2}; // doesn't work
int[] arr2 = false ? new int[]{} : new int[]{1,2}; // works
于 2021-04-06T15:46:08.683 回答