【发布时间】:2018-07-31 10:56:49
【问题描述】:
Integer x1 = Integer.parseInt("4");
Integer y1 = Integer.parseInt("4");
Integer x2 = Integer.parseInt("444");
Integer y2 = Integer.parseInt("444");
System.out.println(x1==y1); // true
System.out.println(x2==y2); // false ???
Integer a1 = Integer.valueOf("4");
Integer b1 = Integer.valueOf("4");
Integer a2 = Integer.valueOf("444");
Integer b2 = Integer.valueOf("444");
System.out.println(a1==b1); // true
System.out.println(a2==b2); // false
我明白为什么第三个和第四个输出打印真假。这是因为valueOf 返回一个对象,并且包装类缓存具有-128 到127 范围内的值的对象。如果valueOf 传递了该范围内的任何值,它应该重用缓存中的对象。否则,它将创建一个新对象。
现在,为什么第二个输出打印为假?我以为parseInt 返回的是一个原语,而不是像valueOf 这样的对象。
【问题讨论】:
-
因为您将其自动装箱到
Integer... -
@TimBiegeleisen。我不同意这是那个的副本。它确实解释了您应该比较整数对象的
.intValue(),并且通常还提供有关它的其他信息。但它未能回答 OP 提出的实际问题。因此,我投票决定重新开放。 -
@KevinCruijssen 请参阅讨论整数常量池的附加链接,它解释了上述问题。这会被一遍又一遍地询问。
-
至于回答问题。在source code of
Integer中,.valueOf方法执行以下操作:return new Integer(parseInt(s, 10, false));。如您所见,它在内部使用.parseInt,并将其放入Integer-constructor 以创建Integer-instance。.parseInt确实返回了一个原语:return parseInt(s, 10, false);。但是,由于您将其保存在Integer字段中,因此会发生自动装箱,这隐含的行为有点类似于在.valueOf方法中使用构造函数。
标签: java parseint autoboxing