欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-15 23:46:22
...

首先,要清楚一点数组为空、数组长度为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和数组首元素为空值在内存的分布

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