我们可以用两种方式之一声明和初始化单维数组
我们可以使用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}
答案 0 :(得分:1)
正如评论中已经提到的:实践中没有区别。所以区别主要是语法。
这可能是您要求的更多细节,但是:它不是完全语法。有趣的是,字节码略有不同。考虑这个课程:
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
检查生成的机器代码这两种方法的机器代码最终将相同。