在java中,“==”是比较object的reference而不是value,自动装箱后,abcd都是Integer这个Object,因此“==”比较的是其引用。那为什么in1 == in2呢,因为在自动装箱时,java在编译的时候Integer in1 = 127;被翻译成Integer a = Integer.valueOf(100);关键就在于这个valueOf()的方法。
- public static Integer valueOf(int i) {
- final int offset = -128;
- if (i >= -128 && i <= 127) {
- return IntegerCache.cache[i + offset];
- }
- return new Integer(i);
- }
- private static class IntegerCache {
- private IntegerCache() {
- }
-
- static final Integer cache[] = new Integer[-(-128) + 127 + 1];
- static {
- for (int i = 0; i < cache.length; i++) {
- cache = new Integer(i - 128);
- }
- }
- }
复制代码
根据上面的jdk源码,java为了提高效率,IntegerCache类中有一个数字缓存了值从-128到127的Integer对象,当我们调用Integer.valueOf(int i)的时候,如果i的值是>=-128且<=127时,会直接从这个缓存中返回一个对象,否则就new一个Integer对象。
我的技术blog里面正好有一篇讲这个的,欢迎去看看
http://blog.csdn.net/u011559849/article/details/21563581 |