我们可以用以下两种方法之一声明和初始化一维数组
一种是我们可以使用new关键字声明,另一种是我们不使用new关键字。因此,当我们不使用new关键字时,如何进行内存分配。
另外,在Java中使用数组时,何时应该进行新的声明
int []a = new int[5];
a[0]=1;
a[1]=2;
a[2]=3;
a[3]=4;
a[4]=5;
int []b = {1,2,3,4,5}
最佳答案
正如评论中已经提到的:在实践上没有区别。因此,差异主要是句法上的。
这可能比您要的要多一些细节,但是:这并不完全是语法上的。有趣的是,字节码略有不同。考虑此类:
class ArrayInit
{
public static void main(String args[])
{
initA();
initB();
}
public static void initA()
{
int []a = new int[5];
a[0]=1;
a[1]=2;
a[2]=3;
a[3]=4;
a[4]=5;
}
public static void initB()
{
int[] b = {1,2,3,4,5};
}
}
编译并反汇编所得的
class
文件javap -c ArrayInit
打印两种方法的结果字节码。两种方法的字节码的并排比较如下所示:
public static void initA(); public static void initB();
Code: Code:
0: iconst_5 0: iconst_5
1: newarray int 1: newarray int
3: astore_0
4: aload_0 3: dup
5: iconst_0 4: iconst_0
6: iconst_1 5: iconst_1
7: iastore 6: iastore
8: aload_0 7: dup
9: iconst_1 8: iconst_1
10: iconst_2 9: iconst_2
11: iastore 10: iastore
12: aload_0 11: dup
13: iconst_2 12: iconst_2
14: iconst_3 13: iconst_3
15: iastore 14: iastore
16: aload_0 15: dup
17: iconst_3 16: iconst_3
18: iconst_4 17: iconst_4
19: iastore 18: iastore
20: aload_0 19: dup
21: iconst_4 20: iconst_4
22: iconst_5 21: iconst_5
23: iastore 22: iastore
23: astore_0
24: return 24: return
可以看到,基本上,在使用
new
并分别分配数组元素的第一个变体中,使用aload_0
instructions将对数组的引用拉到堆栈上。在直接初始化中,引用已在堆栈中,并且仅使用dup
instructions复制。但是,差异可以忽略不计,最后一点都没有关系:稍微扩展程序以使方法被调用数千次,然后使用
java -server -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
检查生成的机器代码,即可发现实际上这两种方法最终将完全相同。关于java - java中数组声明和初始化两种方式之间的区别是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49953989/