java null总结
2019-01-30 本文已影响0人
扎Zn了老Fe
1定义
null 是所有引用类型的默认值。
2. 转换
null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,它还仅仅是一个特殊值,并不属于任何类型,用instanceof永远返回false。
不能将null赋给基本类型变量,例如int、double、float、boolean。如果将null赋值给包装类object,然后将object赋给各自的基本类型,编译器不会报,但是你将会在运行时期遇到空指针异常。
null可以被转化为任何引用类型,可以调用引用类型中的静态方法,但是不可以调用非静态方法,运行时会报错。
public class NullTest {
public static void main(String[] args) {
Object o = (Object) null;
//int i = null;
Integer i = (Integer) null;
String s = (String) null;
System.out.println("o: " + o + "i: " + i + "s: " + s); //o: nulli: nulls: null
System.out.println(o instanceof Object); //false
}
}
3. 运算
null==null返回true,被转换为同种类型的null,都返回true,不同类型直接编译报错.
用String转换后的null可以进行字符串运算,这是因为字符串进行连接的时候,编译器对null进行了特别的优化,其实就是例化StringBuilder,在调用append()方法时对null的一个特别处理,当为null时,转化为“null”,最后调用toString()返回一个String对象.
用八大基本类型转换后的null,不可以进行基本类型的运算,否则会出现编译或者运行错误.
public class NullTest {
public static void main(String[] args) {
Object o = (Object) null;
Integer i = (Integer) null;
Integer j = (Integer) null;
String s = (String) null;
// System.out.println(Objects.equals(i, j));
// System.out.println(i.equals(s));
// System.out.println(null == null);
// i = i + 1; //运行时空指针
// System.out.println(2 == null);
System.out.println("o: " + o + "i: " + i + "s: " + s);
System.out.println(o instanceof Object);
}
}
4. 集合中的key
集合类 | key | value | super | 说明 |
---|---|---|---|---|
HashTable | 不能为null | 不能为null | Dictionary | 线程安全 |
ConcurrentHashMap | 不能为null | 不能为null | AbstractMap | 线程局部安全 |
TreeMap | 不能为null | 可以为null | AbstractMap | 线程不安全 |
HashMap | 可以为null | 可以为null | AbstractMap | 线程不安全 |
hash表需要进行hash值运算,key不能为null好理解,如果map中value为null也好理解。
表中不好理解的是HashMap中key可以为null,看下面代码中对null有个特殊处理,索引位置为0。
![](https://img.haomeiwen.com/i6925065/619bd7c983cb75da.png)
表中第二个不好理解的点是ConcurrentHashMap中value不能为null的问题。
![](https://img.haomeiwen.com/i6925065/f9cf245e2c44330c.png)
至于为什么,参考https://laiqitech.com/125/