开发者社区 问答 正文

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

已解决

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

展开
收起
游客lmkkns5ck6auu 2022-10-26 16:08:48 296 发布于北京 分享
分享
版权
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 举报
    赞同 评论

    评论

    全部评论 (0)

    登录后可评论
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等