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

一种是我们可以使用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/

10-08 22:36