基於Integer值判斷是否相等的問題
面試中經常遇到一個問題:
Integer a = 10; Integer b = 10; System.out.println(a == b); a = 1000; b = 1000; System.out.println(a == b);
兩個打印值分別是多少?
詳解:true;false;
默認IntegerCache.low 是-128,Integer.high是127,如果在這個區間內,他就會把變量i當做一個變量,放到內存中;但如果不在這個范圍內,就會去new一個Integer對象,在這個題目中,10在范圍內,所以直接比較其值;1000不在范圍內,所以jdk幫我new瞭兩個實例,這樣在用==,肯定是false。
補充: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再來比較
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- java兩個integer數據判斷相等用==還是equals
- 詳談java中int和Integer的區別及自動裝箱和自動拆箱
- Java修改Integer變量值遇到的問題及解決
- Java常量池詳解
- java 實現將Object類型轉換為int類型