数组为空、数组长度为0和数组首元素为空值的区别

首先,要清楚一点数组为空、数组长度为0和数组首元素为空值是三个完全不同的概念。下面我以代码为例来详细介绍一下它们的定义和区别。

代码

public class Test {
    public static void main(String[] args) {
        //s0不为空,但它指向空值,长度为0,系统开辟了内存,但内存中没有放任何东西,所以其长度为0,但数组不为空(已经开辟内存了),值却是空值
        String[] s0 = {};
        //s1不为空,长度为1,开辟内存的同时,将1个null放入内存中,所以长度为1--->值为null
        String[] s1 = {null};
        //s2不为空,长度为1,虽然没有初始化但s2[0],但有默认值null,和s1类似
        String[] s2 = new String[2];
        //s3为空,没有长度,调用s3.length会空指针异常,虚拟机不会为其开辟内存,s3不指向任何地方
        String[] s3 = null;

    }
}

数组长度为0

如上述代码所示,s0数组长度为0,指的是数组不为空,数组的“值”为空。系统在栈里面开辟了内存,存放了数组变量s0,但在堆内存中没有放任何东西,所以其长度为0,但数组不为空(已经开辟内存了),值却是空“值”。

数组首元素为空值

如上述代码所示,系统在栈里面开辟了内存,存放了数组变量s1和s2,在堆内存中分配了两个空间分别存放了数组s1和s2的首元素,且值为null,即空值(既然说是空值,说明数组肯定不为空,长度也不为0,只是值为空值而已),所以数组长度为1。

数组为空

如上述代码所示,,虚拟机不会为其开辟内存,s3不指向任何地方,所以s3为空,没有长度,当然也没有首元素的值的说法。调用s3.length会空指针异常。

总结

系统不会为其开辟内存,即是数组为空,此时不存在数组长度和首元素的值的说法。

系统在栈里面开辟了内存,存放了数组变量,但在堆内存中没有放任何东西,就是数组的长度为0,数组的“值”是空,数组不为空,数组没有值,数组的长度为0,没有首元素值的说法。

系统在栈里面开辟了内存,存放了数组变量,同时在堆内存中分配了空间分别数组的首元素,且首元素值为null值,就是数组不为空,数组有长度的说法,数组的值为空值(null),数组的长度大于0。

此外,对于数组为空,会出现空指针异常java.lang.NullPointerException,因此假设一个方法返回一个数组,如果它返回null,则调用方法必须先判断是否返回null,才能对放回数组进一步处理,而如果返回空数组,则无须null引用检查。鉴于此,返回数组的方法在没有结果时我们通常返回空数组,而不是null,这样做对于函数调用者的处理比较方便。

最后用一张图表示一下数组为空、数组长度为0和数组首元素为空值在内存的分布

猜你喜欢

转载自blog.csdn.net/BigData_Hobert/article/details/106389574