Java使用Integer.parseInt进行比较
我理解为什么第三个和第四个输出打印正确和错误。这是因为Java使用Integer.parseInt进行比较,java,parseint,autoboxing,Java,Parseint,Autoboxing,我理解为什么第三个和第四个输出打印正确和错误。这是因为valueOf返回一个对象,而包装类缓存值在-128到127之间的对象。如果valueOf传递了该范围内的任何值,它应该重用缓存中的对象。否则,它将创建一个新对象 现在,为什么第二个输出输出为false?我认为parseInt返回一个原语,而不是像valueOf那样的对象 我认为parseInt返回的是一个原语,而不是像valueOf那样的对象 parseInt返回一个int,但将其分配给一个整数变量,这会导致自动装箱。由于值为444的int
valueOf
返回一个对象,而包装类缓存值在-128到127之间的对象。如果valueOf
传递了该范围内的任何值,它应该重用缓存中的对象。否则,它将创建一个新对象
现在,为什么第二个输出输出为false?我认为parseInt
返回一个原语,而不是像valueOf
那样的对象
我认为parseInt返回的是一个原语,而不是像valueOf那样的对象
parseInt
返回一个int
,但将其分配给一个整数
变量,这会导致自动装箱。由于值为444
的int
自动装箱两次,因此每次创建新的Integer
实例时(因为Integer
缓存不能用于该值),因此将其与=
进行比较将返回false
如果将parseInt
的输出分配给int
,则在这两种情况下,比较将返回true
:
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
因为您正在将其自动装箱为
整数
…@TimBiegeleisen。我不同意这是那个的复制品。它确实解释了您应该比较Integer对象的.intValue()
,并且还提供了关于它的一般附加信息。但它没有回答OP提出的实际问题。因此,我投票决定重新打开。@KevinCruijssen指的是添加的讨论整数常量池的链接,它解释了上述问题。这个问题被反复问。至于回答这个问题。在.valueOf
方法中执行以下操作:返回新整数(parseInt(s,10,false))代码>。如您所见,它在内部使用.parseInt
,并将其放入整数
-构造函数中以创建一个整数
-实例.parseInt
确实返回了一个原语:返回parseInt(s,10,false)代码>。但是,由于您将其保存在一个整数
字段中,因此会发生自动装箱,其行为与.valueOf
方法中构造函数的使用有些类似。
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