直接看问题吧

    for (int i = 0; i < 150; i++) {
Integer a = i;
Integer b = i;
System.out.println(i + " " + (a == b));
}部分结果

结果为:

.....
124 true
125 true
126 true
127 true
128 false
129 false
130 false
131 false

黑人问号?  为什么到128就不行了? 问题在哪里?  (道行太浅!  为什么就认为 false是异端)

查了一下java会自动将(i)int类型转换为Integer类型,即

Integer a = Integer.valueOf(1);

等等,  再仔细思考一下。  结合上述例子,每一次 i和j都会被装箱为Integer   既然是对象,那就不应该返回true了啊?。  那我就用看看 i和j的内存地址()

for(int i=0;i<150;i++){
Integer a=i;
Integer b=i;
System.out.println(a+" "+b+" "+System.identityHashCode(a)+" "+System.identityHashCode(b));
}

部分结果:

1 123 123 1531448569 1531448569
124 124 1867083167 1867083167
125 125 1915910607 1915910607
126 126 284720968 284720968
127 127 189568618 189568618
128 128 793589513 1313922862
129 129 495053715 1922154895

竟然....... 竟然从0到127不同时候自动装箱得到的是同一个对象!从128开始才是正常情况。  那看看源码

    /**
* Returns an {@code Integer} instance representing the specified
* {@code int} value. If a new {@code Integer} instance is not
* required, this method should generally be used in preference to
* the constructor {@link #Integer(int)}, as this method is likely
* to yield significantly better space and time performance by
* caching frequently requested values.
*
* This method will always cache values in the range -128 to 127,
* inclusive, and may cache other values outside of this range.
*
* @param i an {@code int} value.
* @return an {@code Integer} instance representing {@code i}.
* @since 1.5
*/
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

我大概的翻译一下啊,  数再-128到127之间,就直接在缓存里取。否则就返回一个新对象。  哦哦这下问题解决了

05-19 08:37