首页 > Java > java教程 > 正文

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

聖光之護
发布: 2024-12-12 19:12:27
转载
1090人浏览过

如果您正在学习 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 中的 ==:为什么 = 为真但 == 可能为假的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:dev.to网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号