为什么直接把==替换为 Objects.equals 方法就会导致输出结果不一样?
编译器会判断包装数据类型对应的基本数据类型,并采用这个基本数据类型的指令进行比较(比如上面字节码指令中的 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 可下载完整版
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。