1. 程式人生 > >Integer的大小比較

Integer的大小比較

今天在做演算法的時候遇其中到這麼一個問題,在一個類中其中一個屬性是Integer,從後臺的獲取到的資料是一個比較大的陣列,算1000好了

 1publicclass Test {
 2
 3    /** 4     * 關於Integer大小比較問題
 5     * @author 經理
 6     */
 7    publicstaticvoid main(String[] args) {
 8        Integer a =10;
 9        Integer b =10;
10        System.out.println("a==b : "+ String.valueOf(a==b));
11        System.out.println("a.equals(b) : "+ String.valueOf(a.equals(b)));
12    }
13}
14 執行一下,在控制檯得到的結果是這樣的
a==b : true
a.equals(b) : 
true
當是當我們變換一下值
 1publicclass Test {
 2
 3    /** 4     * 關於Integer大小比較問題
 5     * @author 經理
 6     */
 7    publicstaticvoid main(String[] args) {
 8        Integer a =1000;
 9        Integer b 
=1000;
10        System.out.println("a==b : "+ String.valueOf(a==b));
11        System.out.println("a.equals(b) : "+ String.valueOf(a.equals(b)));
12    }
13}

執行一下,控制檯的結果又是
a==b : false
a.equals(b) : 
true
這是什麼原因呢?我當時也有點犯糊塗。有點衝動就直接開原始碼看了。
實際上在我們用Integer a = 數字;來賦值的時候Integer這個類是呼叫的public static Integer valueOf(int i)這個方法。

1publicstatic Integer valueOf(int i) {
2        if(i >=-128&& i <= IntegerCache.high)
3            return IntegerCache.cache[i +128];
4        else5            returnnew Integer(i);
6    }
我們來看看ValueOf(int i)的程式碼,可以發現他對傳入引數i做了一個if判斷。在-128<=i<=127的時候是直接用的int原始資料型別,而超出了這個範圍則是new了一個物件。我們知道"=="符號在比較物件的時候是比較的記憶體地址,而對於原始資料型別是直接比對的資料值。那麼這個問題就解決了。
至於為什麼用int型的時候值會在-128<=i<=127範圍呢呢?我們知道八位二進位制的表示的範圍正好就是-128到127。大概就是因為這吧。

所以當我用1000的時候,已經不在[-127,128]之間了,產生的一個物件而不是一個簡單的基本型別,用“==”或者“>”這類的肯定安利不出來,建立物件成功的話,系統是會分配記憶體的,拿記憶體來比較肯定是沒有意義的。

文中的例子是網上抄的,我也是在專案中切實遇到這個問題才去查詢的,寫下這篇,以示警記