一个阳光明媚的下午,小王正在无所事事的学习,突然微信被一位朋友连环call,原来朋友被一道leetcode给困住了,本着见到bug就想解决掉的冲动,我毫不犹豫的就接了下来。
情况是这样的:
为了方便展示我把leetcode的原问题贴过来:
pop_front
方法的具体实现上:
public int pop_front() {
if (q.isEmpty()) {
return -1;
}
if (q.peek() == d.peekFirst()) {
d.pollFirst();
}
int ans = q.poll();
return ans;
}
看上去没有任何问题啊是不是!而且和官方答案很像:
public int pop_front() {
if (q.isEmpty()) {
return -1;
}
int ans = q.poll();
if (ans == d.peekFirst()) {
d.pollFirst();
}
return ans;
}
看起来只不过是单单把q.peek()
的值给拿出来了而已,然而事实上却不是这样,比如我给你加几条输出语句:
==
号判断出来的结果却是false,唯一一种解释就只能是地址不同 。
于是只用做一个很容易的操作就是把Integer转成int就可以AC:
至此,相信每一个接触过java准备找工作的同学都背过==和equals的区别,甚至倒背如流,但理论只有在实际生产中使用时才是我们学习理论的最终意义,做一个背书机器在我个人看来意义不大。
最后再来总结一下 == 和 equals 的区别,小伙伴们可以温习一遍:
==
的作用是判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。(基本数据类型==
比较的是值,引用数据类型==
比较的是内存地址)。
equals的作用也是判断两个对象是否相等。但它一般有两种使用情况:
==
比较这两个对象。 需要注意的是Integer类中有一个静态内部类IntegerCache,在IntegerCache类中有一个lnteger数组,用以缓存当数值范围为-128~127时的Integer对象,IntegerCache固定了缓存的下限,但是上限可以通过设置jdk的AutoBoxCacheMax参数调整,自动缓存区间设置为【-128,N】;所以当我们定义两个Integer的范围在【-128—+127】之间,并且值相同的时候,用==
比较值为true;当大于127或者小于-128的时候即使两个数值相同,会new一个integer,那么比较的就是两个对象,用“=="比较的时候返回false。
联系客服