直接看問題吧
1 for (int i = 0; i < 150; i++) { 2 Integer a = i; 3 Integer b = i; 4 System.out.println(i + " " + (a == b)); 5 }部分結果
結果為:
.....
124 true 125 true 126 true 127 true 128 false 129 false 130 false 131 false
黑人問號? 為什么到128就不行了? 問題在哪里? (道行太淺! 為什么就認為 false是異端)
查了一下java會自動將(i)int類型轉換為Integer類型,即
1 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 2 124 124 1867083167 1867083167 3 125 125 1915910607 1915910607 4 126 126 284720968 284720968 5 127 127 189568618 189568618 6 128 128 793589513 1313922862 7 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之間,就直接在緩存里取。否則就返回一個新對象。 哦哦這下問題解決了