java中兩個Integer類型的值相比較的問題


今天在做一個算法時,由於為了和其他人保持接口的數據類型一致,就把之前的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()
int 類型返回該 Integer 的值。

 

指定者:
Number 中的 intValue
返回:
轉換為 int 類型后該對象表示的數值。

關於更深入的Integer的底層實現,可查看如下博客:http://blog.csdn.net/snail_rao/article/details/7639194

 

 


免責聲明!

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



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