Jayson_Dai 2022-08-05 14:53 采纳率: 66.7%
浏览 90
已结题

java的0长数组初始化。

请问一下,Java的 0 长数组初始化,以下两个写法是完全等价的吗?
如果是等价的,哪种用的比较多?


```java

public class Test {

    Aoo[] as1 = new Aoo[0];

    Aoo[] as2 = {};

}

```

  • 写回答

8条回答 默认 最新

  • undefine攻城狮 2022-08-05 18:38
    关注

    测试程序:

    @Test
        public void testa (){
            String[] as1 = new String[0];
            String[] as2 = {};
            System.out.println("as1:"+as1);
            System.out.println("as1.length:"+as1.length);
            System.out.println("as2:"+as2);
            System.out.println("as2.length:"+as2.length);
    
            long count=20000000000L;
            Date start3=new Date();
            for (long i=0;i<count;i++){
                String[] as3 = new String[0];
            }
            System.out.println(count+"次 aa = new Array[0];耗时:"+(new Date().getTime()-start3.getTime()));
            Date start4=new Date();
            for (long i=0;i<count;i++) {
                String[] as4 = {};
            }
            System.out.println(count+"次 aa = {};耗时:"+(new Date().getTime()-start4.getTime()));
    
        }
    

    执行结果:

    as1:[Ljava.lang.String;@2a18f23c
    as1.length:0
    as2:[Ljava.lang.String;@d7b1517
    as2.length:0
    20000000000次 aa = new Array[0];耗时:8448 
    20000000000次 aa = {};耗时:7602
    

    结论:
    1、两种方式执行结果是一样的,都会创建对象。数组对象长度为0;调试过程中String[] as1 =new String[0]和String[] as2 = {} 都无法在单步进入下一层。PS:如果想要真的处理过程的差异,估计只能看一下编译器的代码。
    2、执行20000000000次创建,耗时几乎差不多。对于本次贴出来的执行结果:8448、7602有800ms的差异,只是其中一次结果。次数增加时,也有过创建方式2>方式1的情况。和机器当是的负载有关。
    3、把循环初始化as4的代码改为:

    
    for (long i=0;i<count;i++) {
      as2 = {};
    } 
    

    会报编译错误:Array initializer is not allowed here

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 8月16日
  • 已采纳回答 8月8日
  • 创建了问题 8月5日

悬赏问题

  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal