数组为空、数组长度为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和数组首元素为空值在内存的分布
上一篇: 1054 求平均值
下一篇: wave文件格式详解
推荐阅读
-
数组为空、数组长度为0和数组首元素为空值的区别
-
java 定义长度为0的数组/空数组案例
-
一篇文章带你搞懂 Java 中数组长度为 0 和数组为 null 的区别
-
PHP实现移除数组中为空或为某值元素的方法
-
php 过滤空数组方法与过滤数组为空的元素_PHP教程
-
php中empty和array_filter在判断数组是否为空的时候有什么区别
-
php中empty和array_filter在判断数组是否为空的时候有什么区别
-
在php扩展开发中如何初始化类里的一个属性默认值为空数组
-
在php扩展开发中如何初始化类里的一个属性默认值为空数组
-
一个数组算法问题,三维数组,怎么排除掉在第一层的每个数组里面的子数组里面每个元素的sk_id连续8条为空的数组去除掉?