java中的两种数组声明和初始化方式有什么区别

时间:2018-04-21 08:50:25

标签: java arrays

我们可以用两种方式之一声明和初始化单维数组

我们可以使用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}

1 个答案:

答案 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检查生成的机器代码这两种方法的机器代码最终将相同