如果您正在学习 java,您可能已经无数次使用过 == 运算符。处理数字时很简单,对吧?嗯,并非总是如此。当 1 == 1 计算结果为 true 时,会出现一个常见的混淆点,但令人惊讶的是,128 == 128 可能计算结果为 false。这是怎么回事? java坏了吗?绝对不是!关键在于理解 java 中的基本类型、对象引用和自动装箱。让我们一步步揭开这个谜团。

基础知识:原始与对象比较
在 java 中,== 运算符的行为有所不同,具体取决于您比较的是基元还是对象:
对于原语(例如 int、char、double):
== 运算符比较实际值。如果值相同,则结果为 true。
int x = 1;int y = 1;system.out.println(x == y); // true
对于对象(例如,整数、字符串或自定义类):
== 运算符检查两个对象是否指向同一内存位置(即引用相等)。
integer x = new integer(128);integer y = new integer(128);system.out.println(x == y); // false (different memory locations)
自动装箱怎么样?
java 在 java 5 中引入了自动装箱,以使原语及其包装类(如 int 和 integer)的使用更加无缝。它允许你编写这样的代码。
integer a = 1; // autoboxes the int 1 to an integer objectint b = a; // unboxes the integer back to a primitive int
虽然这很方便,但与 == 结合使用时可能会导致微妙的错误。为什么?因为对象和基元在 ==.
时的行为不同
整数缓存
java 通过缓存 -128 到 127 之间的值的 integer 对象来优化内存使用。这意味着如果您在此范围内创建两个 integer 对象,它们将指向相同的内存位置。让我们看看实际效果。
integer x = 127;integer y = 127;system.out.println(x == y); // true (same cached object)integer a = 128;integer b = 128;system.out.println(a == b); // false (different objects)
比较 x 和 y(均为 127)时,java 重用相同的缓存对象。对于 a 和 b(均为 128),java 在缓存范围之外创建两个不同的 integer 对象。因此,a == b 的计算结果为 false。
为什么会发生这种情况?
缓存行为在 integer 类中定义。
private static class integercache { static final integer[] cache = new integer[-(-128) + 127 + 1]; ...}
默认情况下,java 缓存 -128 到 127 范围内的整数值以节省内存。对于超出此范围的数字,将创建新对象。
立即学习“Java免费学习笔记(深入)”;
如何避免这种混乱
如果你想比较两个 integer 对象(或其他包装类)的值,你应该使用 .equals() 方法,或者显式地将它们拆箱为基元。
使用.equals()
integer a = 128;integer b = 128;system.out.println(a.equals(b)); // true
拆箱到原语
钉钉 AI 助理
钉钉AI助理汇集了钉钉AI产品能力,帮助企业迈入智能新时代。
21 查看详情
integer a = 128;integer b = 128;system.out.println(a.intvalue() == b.intvalue()); // true
直接使用基元
int a = 128;int b = 128;system.out.println(a == b); // true
要点
原始比较:== 比较实际值。
int x = 1, y = 1;system.out.println(x == y); // true
对象比较:== 比较内存引用,而不是值。
integer x = 128, y = 128;system.out.println(x == y); // false
整数缓存:java 缓存 -128 到 127 之间的整数对象。
Integer x
以上就是理解 Java 中的 ==:为什么 = 为真但 == 可能为假的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/614726.html
微信扫一扫
支付宝扫一扫