为什么与Integer.valueOf(String)进行==比较会得出127和128的不同结果?

DnR:

我不知道为什么这些代码行返回不同的值:

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有什么不同,我不知道之间127128(我当然知道127< 128。)

另外,为什么第三个返回true

我已经阅读了这个问题的答案,但是我仍然不知道它如何返回true,以及为什么第二行中的代码返回false

诚:

这里有一个惊人的区别。

valueOf正在返回一个Integer对象,该对象的值可能缓存在-128到127之间。这就是为什么第一个值返回true-它被缓存-第二个值返回-128 false不是缓存值,所以得到两个单独的Integer实例。

这是需要注意的重要,你是比较参考Integer#valueOf,如果您比较值比什么缓存支持的更大,这将计算为true,即使解析的值相等(案例:Integer.valueOf(128) == Integer.valueOf(128))。必须equals()改为使用

parseInt正在返回原始值int这就是第三个值返回的原因true- 128 == 128被评估,当然是true

现在,恰好可以得出第三个结果true

  • 对于您正在使用的等价运算符和您拥有的数据类型(即int和)发生拆箱转换Integer当然,您会IntegervalueOf右侧获得

  • 转换后,您正在比较两个原始int值。就像您期望的那样,比较会发生,因此您结束了比较128128

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在Java VS Perl中取模运算会得出不同的结果?

为什么将String串联比将Integer转换为String快于String.valueOf?

在Java中比较Integer包装器时,为什么128 == 128为false但127 == 127为true?

为什么String.valueOf(null)抛出NullPointerException?

为什么将Integer与int进行比较会在Java中抛出NullPointerException?

Double.parseDouble(String)和Double.valueOf(String)有什么区别?

为什么Long.valueOf(0).equals(Integer.valueOf(0))为假?

为什么将String与null比较时会得到NullPointerException?

为什么这两个乘法运算会得出不同的结果?

Double.valueOf(String s)和Double.ParseDouble(String s)有什么区别?

为什么String.valueOf(null)导致空指针异常?

调用Double.valueOf(String)和new Double(String s)有什么区别?

String.valueOf(String Object)的null和“ null”之间的区别是什么

为什么java.lang.Integer.valueOf是flyweight模式?

为什么Java和Go的gzip会得到不同的结果?

为什么`Kernel :: String`检查`to_str`结果而`Kernel :: Integer`不检查`to_int`结果?

为什么萨摩亚的pytz和dateutil会得到不同的结果?

为什么对numpy和python list进行相同的操作会得到不同的结果?

为什么求和和积分会得出不同的结果?

为什么对激活值(Softmax)进行预测会得出错误的结果?

为什么scipy稀疏数组和numpy数组的乘法函数会得出不同的结果?

使用glmnet进行多项式岭回归可以得出结果,对于不同的目标类别,结果的概率大于1,而负数,为什么?

使用NLTK(5400)和Spacy(5300)对句子计数会得出不同的答案。需要知道为什么吗?

为什么将Integer转换为String时String.valueOf比字符串连接快?

为什么getFragmentManager()。findFragmentByTag(String.valueOf(SOME INTEGER))无法正常工作?

为什么不能将int与null进行比较,但可以将Integer与null进行比较

Double和Integer的不同溢出策略。为什么?

Android:为什么在Nexus One和Galaxy Nexus上进行简单的布局测试会得出不同的结果?

为什么在使用for和while循环时会得到不同的结果?