今天刷算法时用到了Stack,我使用了stack==null的判断语句,但运行报错,于是我在修改判断语句为stack.isEmpty()时,发现了empty()这样一个类似的方法,他们之间有什么区别?于是我开始看起了源码:
首先来看isEmpty()方法
public synchronized boolean isEmpty() {
return elementCount == 0;
}
isEmpty()就是很简单的判断栈中元素是否等于0,那我们接下来看看empty()方法
public boolean empty() {
return size() == 0;
}
而empty()则是判断size()是否等于0,那么size()又是如何取值的呢,我们接着看size()源码
public synchronized int size() {
return elementCount;
}
到这里,大家应该都明白了,归根结底两种方法都是去查看elementCount的值,所以两种方法可以说是没有区别的。
而我们也可以做一个实验来查看结果
Stack<Integer> stack = new Stack<>();
System.out.println(stack.empty());
System.out.println(stack.isEmpty());
System.out.println(stack==null);
这段代码的结果为
true
true
false
这也证明了两种方法的相同,可为什么stack==null却不一样呢,这也是我犯的错误
其实(null)空对象是指定义一个对象s,但是没有给该对象分配空间,即没有实例化该对象,所以被实例化的stack并不与null对象相同。