当前位置: 首页 > 图灵资讯 > 技术篇> 理解 Java 中的 ==:为什么 = 为真但 == 可能为假

理解 Java 中的 ==:为什么 = 为真但 == 可能为假

来源:图灵教育
时间:2024-12-15 19:48:49

如果您正在学习 java,您可能已经无数次使用过 == 运算符。处理数字时很简单,对吧?嗯,并非总是如此。当 1 == 1 计算结果为 true 时,会出现一个常见的混淆点,但令人惊讶的是,128 == 128 可能计算结果为 false。这是怎么回事? java坏了吗?绝对不是!关键在于理解 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

以上就是理解 Java 中的 ==:为什么 = 为真但 == 可能为假的详细内容,更多请关注图灵教育其它相关文章!