Integer.valueof 和 Integer.parseInt

 

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"));

  

truehtml

falsejava

trueshell

 

为何第一个判断返回了true而第二个判断返回了false127128有什么我不知道的区别吗?(固然除了127小于128…)
还有,为何第三个判断返回了true
我看了另外一个相关提问的回答,可是我仍是不知道它们何时返回true还有为何第二个判断返回false缓存

回答#1:oracle

Integer.valueOf(String)确有一个不一样寻常的行为。spa

valueOf会返回一个Integer(整型)对象,当被处理的字符串在-128127(包含边界)之间时,返回的对象是预先缓存的。这就是为何第一行的调用会返回true-127这个整型对象是被缓存的(因此两次valueOf返回的是同一个对象)——第二行的调用返回false是由于128没有被缓存,因此每次调用,都会生成一个新的整型对象,所以两个128整型对象是不一样的对象。code

重要的是你要知道在上面的比较中,你实际进行比较的是integer.valueOf返回的对象引用,因此当你比较缓存外的整型对象时,相等的判断不会返回true,就算你传个valueOf的值是相等的也没用。(就像第二行中Integer.valueOf(128)==Integer.valueOf(128))。想让这个判断返回true,你须要使用equals()方法。htm

parseInt()返回的不是整型对象,而是一个int型基础元素。这就是为何最后一个判断会返回true,第三行的判断中,在判断相等时,实际比较的是128 == 128,因此它必然是相等的。对象

再来讲说第三种比较中的一点区别,使得它的结果与第二种比较不同了:blog

一个unboxing conversion(一种比较时的转换,把对对象的引用转换为其对应的原子类型)在第三行的比较中发生了。由于比较操做符使用了==同时等号的两边存在一个int型和一个Integer对象的引用。这样的话,等号右边返回的Integer对象被进一步转换成了int数值,才与左边进行相等判断。

因此在转换完成后,你实际比较的是两个原子整型数值。这种转换正是你在比较两个原子类型时所期待看到的那样,因此你最终比较了128等于128

回答#2:

Integer类有一个静态缓存,存储了256个特殊的Integer对象——每一个对象分别对应`-128 和127之间的一个值。
有了这个概念,就能够知道上面三行代码之间的区别。

1
new Integer(123);

显示建立了一个新的Integer对象。

1
Integer.parseInt( "123" );

解析完字符串后返回一个int值。

1
Integer.valueOf( "123" );

这种状况比其余的要更复杂一些。首先进行了字符串解析,而后若是解析的值位于-128127之间,就会从静态缓存中返回对象。若是超出了这个范围,就会调用Integer()方法并将解析的值做为参数传入,获得一个新的对象。

如今,让咱们看一下问题中的3个表达式。

1
Integer.valueOf( "127" )==Integer.valueOf( "127" );

上面的表达式返回true,由于Integer的值从静态缓存中取了2次,表达式返回了对象与本身比较的结果。由于只有一个Integer对象,因此返回结果为true

1
Integer.valueOf( "128" )==Integer.valueOf( "128" );

上面的表达式返回false,由于128没有存在静态缓冲区。因此每次在判断相等时等式两边都会建立新的Integer对象。因为两个Integer对象不一样,因此==只有等式两边表明同一个对象时才会返回true。所以,上面的等式返回false

1
Integer.parseInt( "128" )==Integer.valueOf( "128" );

上面的表达式比较的是左边的原始int128与右边新建立的Integer对象。可是由于intInteger之间比较是没有意义的,因此Java在进行比较前会将Integer自动拆箱,因此最后进行的是intint值之间的比较。因为128和本身相等,因此返回true

补充说明:
文章没有列出具体的执行环境,jdk版本信息,所以形成不同的结果,让你们误解了.抱歉.如今说明一下:
此文只适应于jdk7或以上版本,由于jdk6jdk7的Integer具体实现有差异,详情可查看下源代码.

truefalsetrue

相关文章
相关标签/搜索