我不知道为什么这些代码行返回不同的值:
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。)
true
false
127
128
另外,为什么第三个返回true?
这里有一个显着的区别。
valueOf正在返回一个Integer对象,该对象的值可能缓存在 -128 和 127 之间。这就是为什么第一个值返回true- 它被缓存 - 而第二个值返回false- 128 不是缓存值,所以你得到两个单独的Integer实例.
valueOf
Integer
需要注意 的是,您将引用与 进行比较Integer#valueOf,如果您比较的值大于缓存支持的值,则即使解析的值相等(例如:) ,它也 不会 评估为。您 必须 改用。true``Integer.valueOf(128) == Integer.valueOf(128) __equals()
Integer#valueOf
true``Integer.valueOf(128) == Integer.valueOf(128)
equals()
parseInt正在返回一个原语int。这就是为什么第三个值返回true-128 == 128被评估,当然是,true。
parseInt
int
128 == 128
现在,恰好产生了第三个结果true:
对于您正在使用的等价运算符和您拥有的数据类型(即int和Integer. 当然,你会从右手边得到一个Integerfrom 。valueOf
转换后,您将比较两个原始int值。比较的发生就像您对原语所期望的那样,因此您最终比较128和128。