今天在做一個算法時,由於為了和其他人保持接口的數據類型一致,就把之前的int換為Integer,前幾天測了幾組數據,和之前的結果一樣,但是今天在測其它數據
的時候,突然出現了一個奇怪的bug,由於之前我的模塊所有的數據(就是當時數據類型還是int)都測過,這個算法整體由三個所寫的模塊構成(包括我在內),所以其他
兩位同伴都去檢測各自的模塊,但是后來發現是我傳出來的數據有點問題,當時我也是百思不得其解,就一路打斷點,加肉眼查看數據,后來終於發現是兩個Integer類型的
值在本應該相等的地方進入相等體系中的邏輯,但卻進入了不相等的邏輯流程中,這兩個數是412(Integer),然后當時我就直接將一側的Integer直接換成412后,就可以
進入相等的邏輯中,將另一側換成Integer后,也可以進入相等的邏輯。
下面以一個例子看一下:
1 package intAndInteger; 2 3 public class test { 4 public static void main(String[] args) { 5 // 兩個new出來的Integer類型的數據比較, 6 //相當於把new出來的地址作比較 7 8 Integer a0 = new Integer(1);// 普通的堆中對象 9 Integer b0 = new Integer(1); 10 System.out.println("new出來的 " + "a0==b0 :" + (a0 == b0)); 11 System.out.println(a0); 12 13 // 調用intValue方法得到其int值 14 System.out.println("調用intValue " + "a0.intValue() == b0.intValue()" + 15 (a0.intValue() == b0.intValue())); 16 17 // 把Integer類型的變量拆箱成int類型 18 int c = 1; 19 System.out.println("將Integer自動拆箱 " + "a0==c: " + (a0 == c)); 20 21 // 其實也是內存地址的比較 22 Integer a1 = 30; // 自動裝箱,如果在-128到127之間,則值存在常量池中 23 Integer b1 = 30; 24 System.out.println("直接賦值的兩個Integer的比較" + 25 "a2 == b2: "+ (a1 == b1)); 26 27 Integer a2 = 30; 28 Integer b2 = 40; 29 System.out.println("直接賦值的兩個Integer的比較 " + 30 "a6==b6: " + (a2 == b2)); 31 32 Integer a3 = 128; 33 Integer b3 = 128; 34 System.out.println("直接賦值的兩個Integer的比較 " + 35 "a5 == b5: " + (a3 == b3)); 36 37 Integer a4 = 412; 38 Integer b4 = 412; 39 System.out.println("直接賦值的兩個Integer的比較 " + 40 "a4 == b4: " + (a4 == b4)); 41 // 從這里看出,當給Integer直接賦值時, 42 //如果在-128到127之間相等的話,它們會共用一塊內存 43 // 而超過這個范圍,則對應的Integer對象有多少個就開辟多少個 44 45 System.out.println("調用intValue " + "a4.intValue() == b4.intValue(): " 46 + (a4.intValue() == b4.intValue())); 47 } 48 }
在JDK1.8.0下運行可得:
1 new出來的 a0==b0 :false 2 1 3 調用intValue a0.intValue() == b0.intValue()true 4 將Integer自動拆箱 a0==c: true 5 直接賦值的兩個Integer的比較a2 == b2: true 6 直接賦值的兩個Integer的比較 a6==b6: false 7 直接賦值的兩個Integer的比較 a5 == b5: false 8 直接賦值的兩個Integer的比較 a4 == b4: false 9 調用intValue a4.intValue() == b4.intValue(): true
綜上:在用兩個Integer對象比較數值的話,如果是整型值的話最好調用intValue方法來得到一個int類型的值,當然也可將其轉變為
float(floatValue),double(longValue)類型來比較。
在JDK API 1.6.0中文版中是這樣介紹intValue的,
intValue
public int intValue()
關於更深入的Integer的底層實現,可查看如下博客:http://blog.csdn.net/snail_rao/article/details/7639194