龙珠

修炼自己与发现世界

Java:null是什么?

null是Java中的一个关键字,代表为空。

一、null可以赋给引用类型变量,但不能赋给基本类型变量。

Java中的基本类型变量有8种,分别是:int, short, byte, char, double, long, float, boolean。对于这8种基本类型变量的赋值,不可以使用null。对于其他如String,或者自定义类型,都可以使用null定义初值。但是,如下面两种赋值方式是有区别的:

String s = "" VS String s = null

前者是对s赋值一个长度为0的字符串,s指向一个空字符串的内存空间,你可以对这块空间做任何操作;

后者是对s定义了一个句柄,也就是说有了这个引用,但这个引用并没有指向任何一个内存空间。

二、null本身不是对象,也不是Object的实例

如果使用代码:

System.out.println("null is Object?"+(null instanceof Object));

输出结果是:

null is Object?false

也就是说,null本身不是一个Object的实例。

因为null不是一个对象,所以对其的操作都会报空指针错。例如,代码如下:

String s = null;
System.out.println("1:"+s.equals(""));
System.out.println("2:"+"".equals(s));

运行结果是会报错:

Exception in thread "main" java.lang.NullPointerException

而如果调整下顺序让2先输出,则结果是:

2:false
Exception in thread "main" java.lang.NullPointerException

因此,前者会报异常,后者不会。就是因此null的缘故。

三、对引用变量赋初值为null

在Java中,如果变量没有显式的赋初值,则会被默认赋值。基本数据类型如int、long等赋值为0,float、double等赋值0.0,boolean赋值为false,而对引用类型变量则是赋初值为null。

四、容器类型与null

List:允许重复元素,可以加入任意多个null。

Set:不允许重复元素,最多可以加入一个null。

Map:Map的key最多可以加入一个null,value字段没有限制。

数组:基本类型数组,定义后,如果不给定初始值,则java运行时会自动给定值。引用类型数组,不给定初始值,则所有的元素值为null。

五、null的其他作用

1. 判断一个引用类型是否为null,使用“==”来判断;

2.  将变量赋值为null,表示不再使用,取消引用,等待JVM对内存的回收。

参考资料:

  1. 深入Java关键字null

  2. Java中null类型研究说明