Why do == comparisons with Integer.valueOf(String) give different results for 127 and 128?(为什么 == 与 Integer.valueOf(String) 的比较对 127 和 128 给出不同的结果?)
问题描述
我不知道为什么这些代码行返回不同的值:
I have no idea why these lines of code return different values:
System.out.println(Integer.valueOf("127")==Integer.valueOf("127"));
System.out.println(Integer.valueOf("128")==Integer.valueOf("128"));
System.out.println(Integer.parseInt("128")==Integer.valueOf("128"));
输出是:
true
false
true
为什么第一个返回true,第二个返回false?127 和 128 之间有什么我不知道的不同之处吗?(当然我知道127 < 128.)
Why does the first one return true and the second one return false? Is there something different that I don't know between 127 and 128? (Of course I know that 127 < 128.)
还有,为什么第三个返回true?
Also, why does the third one return true?
我已阅读这个问题的答案,但我还是没搞懂怎么返回true,为什么第二行的代码返回false.
I have read the answer of this question, but I still didn't get how it can return true, and why the code in second line returns false.
推荐答案
这里有一个显着的区别.
There's a striking difference here.
valueOf 正在返回一个 Integer 对象,该对象的值可能缓存在 -128 和 127 之间.这就是第一个值返回 true - 它已缓存 - 第二个值返回 false - 128 不是缓存值,因此您将获得两个单独的 Integer 实例.
valueOf is returning an Integer object, which may have its values cached between -128 and 127. This is why the first value returns true - it's cached - and the second value returns false - 128 isn't a cached value, so you're getting two separate Integer instances.
请务必注意,您将引用与 Integer#valueOf 进行比较,如果您比较的值大于缓存支持的值,它将not 评估为 true,即使解析的值是等价的(例如:Integer.valueOf(128) == Integer.valueOf(128)代码>).您必须改用 equals().
It is important to note that you are comparing references with Integer#valueOf, and if you are comparing a value that is larger than what the cache supports, it will not evaluate to true, even if the parsed values are equivalent (case in point: Integer.valueOf(128) == Integer.valueOf(128)). You must use equals() instead.
parseInt 正在返回一个原始 int.这就是为什么第三个值返回 true - 128 == 128 被评估,当然是 true.
parseInt is returning a primitive int. This is why the third value returns true - 128 == 128 is evaluated, and is of course, true.
现在,恰好使第三个结果 true:
Now, a fair bit happens to make that third result true:
一个拆箱转换发生在 您正在使用的等价运算符和您拥有的数据类型 - 即
int和Integer.当然,您会从右侧的valueOf获得一个Integer.
An unboxing conversion occurs with respect to the equivalence operator you're using and the datatypes you have - namely,
intandInteger. You're getting anIntegerfromvalueOfon the right hand side, of course.
转换后,您将比较两个原始 int 值.比较会按照您对原语的预期进行,因此您最终会比较 128 和 128.
After the conversion, you're comparing two primitive int values. Comparison happens just as you would expect it to with respect to primitives, so you wind up comparing 128 and 128.
这篇关于为什么 == 与 Integer.valueOf(String) 的比较对 127 和 128 给出不同的结果?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么 == 与 Integer.valueOf(String) 的比较对 127 和 128 给出不同的结果?
- C++ 和 Java 进程之间的共享内存 2022-01-01
- Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
- 将log4j 1.2配置转换为log4j 2配置 2022-01-01
- Eclipse 插件更新错误日志在哪里? 2022-01-01
- 如何使用WebFilter实现授权头检查 2022-01-01
- Java包名称中单词分隔符的约定是什么? 2022-01-01
- value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01
- Jersey REST 客户端:发布多部分数据 2022-01-01
- Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
- 从 finally 块返回时 Java 的奇怪行为 2022-01-01
