【问题标题】:Java using Integer.parseInt for comparison [duplicate]Java使用Integer.parseInt进行比较[重复]
【发布时间】: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


【解决方案1】:

我认为 parseInt 返回的是原语,而不是像 valueOf 那样的对象。

parseInt 返回一个int,但你将它分配给一个Integer 变量,这会导致自动装箱。由于值为444int 被自动装箱两次,因此每次创建一个新的Integer 实例时(因为Integer 缓存不能用于该值),因此将它们与@987654328 进行比较@返回false

如果您将parseInt 的输出分配给int,则两种情况下的比较都将返回true

int x1 = Integer.parseInt("4");
int y1 = Integer.parseInt("4");
int x2 = Integer.parseInt("444");
int y2 = Integer.parseInt("444");

System.out.println(x1==y1); // true
System.out.println(x2==y2); // true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-21
    • 2012-06-04
    • 2012-11-11
    • 2011-10-19
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多