如果您正在学习 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 object int 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
拆箱到原语
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