请问一下,Java的 0 长数组初始化,以下两个写法是完全等价的吗?
如果是等价的,哪种用的比较多?
```java
public class Test {
Aoo[] as1 = new Aoo[0];
Aoo[] as2 = {};
}
```
测试程序:
@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 。
你初始化个0长数组是为了点什么呢
数组长度不可变
你需要改变它的长度时还要重新new
那你为什么不一开始直接给它赋值成null,而要new一个0长数组呢
java 开发中 Aoo[] as2 = {}; 这种用法多点。
区别在于:
分配空间与赋值分步进行
分配空间同时赋值
同时分配空间,和指定内容;
看你想要什么了
我这边开发,很少会定义长度0的数组, 多数是定义长度0的List, 在某些特殊情况下替代null,防止报错,
建议用第一种写法, 要考虑后期维护,不能保证以后接手项目的是个大佬,万一是个新手接手,写这么多语法糖,会让新手崩溃的!
数组初始化分为动态初始化和静态初始化,一般采用静态初始化
动态初始化:int[] arr = new int[3]
静态初始化:第一种:int[] arr = new int[]{1, 2, 3} 或 第二种: int[] arr = {1, 2, 3},静态初始化以第二种方式用的最多
博主想初始化0长度的数组,其实就是一个空数组,采用你写的第二种方式 Aoo[] as2 = {},或者直接赋值为null
静态初始化和动态初始化的区别
数组初始化的话 Aoo[] as2 = {}; 这种会多一点 ,但是不符合实际操作。
我这项目中的具体使用的时候 , 都是先Aoo[] as2 = null; 然后在具体使用的时候在as2 = new Aoo[];
如果知道数组的长度是固定的时候, 才会在创建数组的时候 指定其长度:as2 = new Aoo[8];