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

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

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


  情况是这样的:


image.pngimage.png


中间的图片放大来看:


55.png



完整的代码:


image.png

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

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


6.png



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

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



7.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。


相关文章
|
12天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1262 5
|
1天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
11天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1280 87
|
12天前
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
1823 13