关于null
《心经》中有段话说的是“色即是空,空既是色”,那么这里的空指的是什么呢?用Java里术语来说就是null。null指的就是虚无,那怎么体现呢?且看下面小栗子
Map<String,String> map = new HashMap<>();
String b = map.get("b");
if(b == null) {
System.out.println("b is null");
}
运行结果毫无疑问的是
b is null
因为事先并没有对b这个键进行设置,所以在map里面就根本不存在,也就说在虚拟机内存里并没有分配内存。用一句话来说就是“万物皆空”,对于这种情况,都是null。而此时若要对b进行强制操作,则会抛出NullPointException异常。这也就是空指针异常的原因所在。
关于“”
“”就是空的字符串,那何又为空的字符串?
String s1 = new String();
String s2 = "";
if("".equals(s1)) {
System.out.println("s1是空串");
}
if("".equals(s2)) {
System.out.println("s2也是空串");
}
运行结果为
s1是空串
s2也是空串
为什么s1也是空串呢?查看源码可以看到其中有个构造方法是这样写的
public String() {
this.value = "".value;
}
也就说但实例化的时候就已经为其赋空值了。此时是为其分匹配了内存空间,只不过值为空而已。
关于isEmpty()
isEmpty()并不是String类型所特有的方法,ArrayList,HashMap,HashSet也同样拥有此方法,原因在于isEmpty()实际上是Collection<E>中定义的方法,而所有继承了该接口的方法都将会实现。
下面举个小栗子看下其作用
List<String> al = new ArrayList<>();
if(al.isEmpty()) {
System.out.println("ArrayList isEmpty");
}
其结果毫无疑问的是ArrayList isEmpty。
源码对此给出的解释是
public boolean isEmpty() {
//String
return value.length == 0;
//ArrayList,HashMap
return size == 0;
//HashSet
return map.isEmpty();
}
如果对此你还有疑问,那么可以想象下在一个寂静无声,漆黑吞噬掉了整片大地,有一座空荡荡的大楼,此时这座大楼可以看成是个虚拟机内存。一个黑影以迅雷不及掩耳盗铃响叮当之势向虚拟机内存管理委员会提交了一份声明,将要在此打造宇宙级的豪华酒店Luxueux,此时这个Luxueux在大楼里并不存在,所以是null,包括你能想象到的然而实际上并不存在的都可以认为是null。不久它被建立起来了,地址007。此时可以通过007找到Luxueux超级酒店,然而里面什么都没有,俨然成了鬼店。这时它就是isEmpty()。如果Luxueux是用String打造的,那它就是“”。isEmpty()的范围更大,而“”只适用于String。