Java中数组初始化的差异

10

以下两种数组初始化方式有什么区别:

  1. Object[] oArr = new Object[] {new Object(), new Object()};
  2. Object[] oArr = {new Object(), new Object()};

它们与堆栈分配有关吗?

谢谢!


8
没有区别。 - Carl Manaster
过早的优化是万恶之源。 - gulbrandr
@ Carl Manaster:这应该是你的答案。 - Naveed
谢谢,@Naveed,但这个回答太简短了。 - Carl Manaster
5
@gulbrandr:只有当原帖作者认为它们执行相同操作并询问哪个更快时,才会出现过早优化的情况。当他询问两者之间是否存在任何差异时,这不是一个“优化”问题——如果它们行为不同,那么这比优化更重要。 - Jon Skeet
显示剩余2条评论
4个回答

22

完全没有区别 - 它们只是表达同一件事情的不同方式。

然而,第二种形式仅适用于变量声明。例如,您不能编写:

foo.someMethod({x, y});

但你可以这样写:

foo.someMethod(new SomeType[] { x, y });

Java语言规范中相关的部分是第10.6节 - 数组初始化器

可以在声明中指定一个数组初始化器,也可以作为数组创建表达式(§15.10)的一部分来创建一个数组并提供一些初始值:


我认为更好的方法是将return new SomeType[] {x, y};放在一个方法中。这种写法是有效的,但return {x, y};无效的 - Priyanshul Govil
@PriyanshulGovil:我不明白为什么要特别强调返回语句。我已经给出了一个例子,以及第二种形式在变量声明中的一般情况。返回语句不是变量声明,因此在该上下文中无效。 - Jon Skeet
哦,我同时在看另一个问题,它问的是new SomeType[] {..}{..}之间的区别(不仅限于赋值时),我在错误的问题上发表了评论。对此我感到抱歉。 - Priyanshul Govil
虽然 SomeType object = SomeFunction() 仍然是从返回 SomeType 的函数初始化 object - Priyanshul Govil
哈哈,我其实正在尝试那个。这就是我偶然发现这里的原因 ;) - Priyanshul Govil
显示剩余2条评论

2
完全相同。第二个是第一个的缩写形式(只有当它作为变量声明的一部分时才允许,就像这里一样)。

1
在Java中,所有对象都存在堆中,由于数组也是Java中的对象,因此它们存在于栈中。
对于这两个对象,在结果上没有区别,您将得到具有相同元素的两个数组对象。
但是有时您会遇到一些情况,无法使用它们,例如您不知道数组的元素。然后您可以使用以下形式: Object [] array=new Object[size];

0

还有一个小而引人注目的区别!

你可以做到

int[] arr;
arr= {1,2,3}; // Illegal

但你完全可以做到

int[] arr;
arr = new [] {1,2,3} //Legal

如果您稍后要初始化,则不能执行此操作。

int arr;
arr = new [] {1,2,3} //Illegal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接