Java: Integer用==比較時127相等128不相等的原因


直接看問題吧

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之間,就直接在緩存里取。否則就返回一個新對象。  哦哦這下問題解決了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM