java中==和equals理论联系实际的坑你踩了吗?剑指 Offer 59 - II. 队列的最大值

简介:   一个阳光明媚的下午,小王正在无所事事的学习,突然微信被一位朋友连环call,原来朋友被一道leetcode给困住了,本着见到bug就想解决掉的冲动,我毫不犹豫的就接了下来。

  一个阳光明媚的下午,小王正在无所事事的学习,突然微信被一位朋友连环call,原来朋友被一道leetcode给困住了,本着见到bug就想解决掉的冲动,我毫不犹豫的就接了下来。

  情况是这样的:


image.pngimage.png


中间的图片放大来看:

66.png

完整的代码:


image.png


为了方便展示我把leetcode的原问题贴过来:


68.png


小伙伴被困在了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()的值给拿出来了而已,然而事实上却不是这样,比如我给你加几条输出语句:


69.png


我们会发现一个“奇怪”的现象,868和868竟然是不相同的,其实这里已经可以看出来了,明明相同的两个值用 == 号判断出来的结果却是false,唯一一种解释就只能是地址不同 。

于是只用做一个很容易的操作就是把Integer转成int就可以AC:


70.png


至于为什么46和46相等,原因还在于Integer的缓存机制,后面会讲。


 至此,相信每一个接触过java准备找工作的同学都背过==和equals的区别,甚至倒背如流,但理论只有在实际生产中使用时才是我们学习理论的最终意义,做一个背书机器在我个人看来意义不大。


最后再来总结一下 == 和 equals 的区别,小伙伴们可以温习一遍:


 ==的作用是判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。



 equals的作用也是判断两个对象是否相等。但它一般有两种使用情况:


类没有覆盖 equals方法。则通过equal 比较该类的两个对象时,等价于通过==比较这两个对象。

类覆盖 equals()方法。一般我们都通过覆盖equals方法来判断两个对象的内容是否相等;

 需要注意的是Integer类中有一个静态内部类IntegerCache,在IntegerCache类中有一个lnteger数组,用以缓存当数值范围为-128~127时的Integer对象,IntegerCache固定了缓存的下限,但是上限可以通过设置jdk的AutoBoxCacheMax参数调整,自动缓存区间设置为【-128,N】;所以当我们定义两个Integer的范围在【-128—+127】之间,并且值相同的时候,用==比较值为true;当大于127或者小于-128的时候即使两个数值相同,会new一个integer,那么比较的就是两个对象,用“=="比较的时候返回false。


相关文章
|
5月前
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
164 1
|
5月前
|
存储 Java 开发者
Java 中的 equals 方法:看似简单,实则深藏玄机
本文深入探讨了Java中`equals`方法的设计与实现。默认情况下,`equals`仅比较对象引用是否相同。以`String`类为例,其重写了`equals`方法,通过引用判断、类型检查、长度对比及字符逐一比对,确保内容相等的逻辑。文章还强调了`equals`方法需遵循的五大原则(自反性、对称性等),以及与`hashCode`的关系,避免集合操作中的潜在问题。最后,对比了`instanceof`和`getClass()`在类型判断中的优劣,并总结了正确重写`equals`方法的重要性,帮助开发者提升代码质量。
384 1
|
8月前
|
存储 监控 Java
JAVA线程池有哪些队列? 以及它们的适用场景案例
不同的线程池队列有着各自的特点和适用场景,在实际使用线程池时,需要根据具体的业务需求、系统资源状况以及对任务执行顺序、响应时间等方面的要求,合理选择相应的队列来构建线程池,以实现高效的任务处理。
351 12
|
9月前
|
存储 Java C++
java中“==”和equals,究竟比的是什么
java中“==”和equals,究竟比的是什么
151 4
|
11月前
|
存储 算法 Java
【用Java学习数据结构系列】用堆实现优先级队列
【用Java学习数据结构系列】用堆实现优先级队列
150 0
|
11月前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
101 2
|
11月前
|
存储 Java C++
java中“==”和equals,究竟比的是什么
java中“==”和equals,究竟比的是什么
118 3
java中“==”和equals,究竟比的是什么
|
Java API 容器
JAVA并发编程系列(10)Condition条件队列-并发协作者
本文通过一线大厂面试真题,模拟消费者-生产者的场景,通过简洁的代码演示,帮助读者快速理解并复用。文章还详细解释了Condition与Object.wait()、notify()的区别,并探讨了Condition的核心原理及其实现机制。
|
存储 Java 索引
【Java基础面试二十三】、==和equals()有什么区别?
这篇文章区分了Java中的`==`运算符和`equals()`方法:`==`用于基本数据类型时比较值是否相等,用于引用类型时比较内存地址是否相同;而`equals()`默认实现按内存地址比较,但通常被重写以根据对象内容比较是否相等。
【Java基础面试二十三】、==和equals()有什么区别?