开发者社区> 问答> 正文

为什么直接把==替换为 Objects.equals 方法就会导致输出结果不一样?

已解决

为什么直接把==替换为 Objects.equals 方法就会导致输出结果不一样?

展开
收起
游客lmkkns5ck6auu 2022-10-26 16:08:48 278 0
1 条回答
写回答
取消 提交回答
  • 推荐回答

    编译器会判断包装数据类型对应的基本数据类型,并采用这个基本数据类型的指令进行比较(比如上面字节码指令中的 sipush 和 if_icmpne 等),相当于编译器自动对常量进行了数据类型的强制转化。

    通 过 反 编 译 第 二 段代码,我们得到语句 “System.out.println(Objects.equals(shortValue,12345));”的字节码指令如图1。原来,编译器根据字面意思,认为常量 12345 默认基本数据类型是 int,所以会自动转化为包装数据类型 Integer。

    在 Java 语言中,整数的默认数据类型是 int,小数的默认数据类型是 double。通过分 析 Objects.equals 方法的 源 代码可 知 :语句“System.out.println(Objects.equals(shortValue,12345))”,因为 Objects.equals的两个参数对象类型不一致,一个是包装数据类型 Short,另一个是包装数据类型 Integer , 所 以 最 终 的 比 较 结果必 然 是 false ;而语句 “System.out.println(Objects.equals(intValue,12345))”,因为 Objects.equals 的两个参数对象类型一致,都是包装数据类型 Integer 且取值相同,所以最终的比较结果必然是 true。

    以上内容摘自《Java工程师必读手册》电子书,点击https://developer.aliyun.com/ebook/download/7780 可下载完整版

    2022-10-26 19:39:28
    赞同 展开评论 打赏
来源圈子
更多
收录在圈子:
阿里云开发者社区官方技术圈,用户产品功能发布、用户反馈收集等。
问答排行榜
最热
最新

相关电子书

更多
AutoAlerts-From Data to Action 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载