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对内存的回收。
参考资料: