Integer值判斷是否相等問題 要用equals判斷不要用「==」判斷

昨天在開發中遇到一個問題,定義了兩個Integer變量,暫且定義爲Integer a;  Integer b;前端

這兩個值由前端賦值並傳到後臺,前臺傳的是a = 12345, b = 12345,  但我在後臺比較的時候 if (a == b),卻返回false,好無語啊,不都是123嗎?爲何返回false,後來改成equals(),返回true,但其中的有些端倪還不太清楚,現總結下:對象

 

咱們知道Integer是int的包裝類,在jdk1.5以上,能夠實現自動裝箱拆箱,就是jdk裏面會自動幫咱們轉換,不須要咱們手動去強轉,因此咱們常常在這兩種類型中隨意寫,平時也沒什麼注意內存

但Integer他是對象,咱們知道 == 比較的是堆中的地址,但有個奇怪的事是, 若是 Integer a = 123, Integer b = 123,能夠返回true,但若是Integer a = 12345, Integer b = 12345,返回false,這就是jdk的東西,咱們看下Integer的源碼開發

 

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

 默認IntegerCache.low 是-127,Integer.high是128,若是在這個區間內,他就會把變量i當作一個變量,放到內存中;但若是不在這個範圍內,就會去new一個Integer對象,源碼

 

而我在代碼中,兩個Integer值都不在這個範圍內,因此jdk幫我new了兩個實例,這樣在用==,確定是false。後臺

因此若是要比較Integer的值,比較靠譜的是經過Integer.intValue();這樣出來的就是int值,就能夠直接比較了;或者equals()比較變量

Integer的底層 equals是這樣定義的 先拆箱爲int再來比較 jdk

public boolean equals(Object obj) {總結

        if (obj instanceof Integer) {static

            return value == ((Integer)obj).intValue();

        }

        return false;

    }

相關文章
相關標籤/搜索