【问题标题】:Java stream misconceptions… some clarification? [duplicate]Java 流的误解......一些澄清? [复制]
【发布时间】:2014-04-14 11:55:00
【问题描述】:

我用JAVA写了如下代码,

Integer i=10;
Integer i1=10;
s.o.pln(i==i1);//true
Integer j=100;
Integer j1=100;
s.o.pln(j==j1);//true
Integer k=1000;
Integer k1=1000;
s.o.pln(k==k1);//false

这里,由于 Integer 是一个包装类,它必须对所有声明的类型都显示为真。 但它显示 1000 为 false。

谁能解释一下背后的原因。

【问题讨论】:

  • 这是因为,如果我没记错的话,JRE(至少是 Oracle 的)缓存了 -128 到 127 之间的所有 Integers 或类似的东西
  • “它必须对所有声明的类型都显示为真”绝对不是。 Integer 不是 int。你在这里做的是比较references当且仅当等于运算符的一个成员是int 时,Integer 将被“自动拆箱”到 int。试试int k1 = 1000;

标签: java class integer wrapper variable-declaration


【解决方案1】:

首先,请注意,当应用于对象(如整数)时,== 运算符会比较引用。

接下来,请注意,这些赋值意味着从 int(原始)类型到 Integer(对象)的装箱转换(也称为“自动装箱”)。

并根据Java Specification - Conversions

"如果被装箱的值是...一个介于-128 和127 之间的int 或短数,那么令r1 和r2 为p 的任意两次装箱转换的结果。总是r1 == r2 。”

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 2014-11-08
    • 2017-12-29
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多