运行下面这段代码:
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"));
JDK1.6输出结果:
false false true
JDk1.7输出结果:
true false true
下面来研究一下为什么会出现这种情况。
JDk1.7中Integer源码中valueOf方法:
第一步:
第二步:
第三步:
可以发现,valueOf会返回一个Integer(整型)对象,当被处理的字符串在-128和127(包含边界)之间时,返回的对象是预先缓存的。
可以得出:
第一行的调用返回true,这个整型对象127是被缓存的
第二行的调用返回false是因为128没有被缓存。
JDk1.6中Integer源码中valueOf方法:
第一步:
第二步:
可以发现,valueOf无论大小都会返回一个new 的 新的Integer(整型)对象,所以都不一样。
可以得出:
第一行的调用返回false,返回一个新的Integer(整型)对象
第二行的调用返回false,,返回一个新的Integer(整型)对象。
第三行的方法Integer.parseInt(String),这个方法反回的int
对应的Integer源码如下:
比较操作符使用了==同时等号的两边存在一个int型和一个Integer对象的引用时,Java在进行比较前会将Integer自动拆箱,所以最后进行的是int和int值之间的比较。
即:128==128,返回true。
小结:JDK1.7版本开始,Integer有了静态缓存,这点注意一下。