Integer的大小比較
阿新 • • 發佈:2019-02-20
今天在做演算法的時候遇其中到這麼一個問題,在一個類中其中一個屬性是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));
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
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]之間了,產生的一個物件而不是一個簡單的基本型別,用“==”或者“>”這類的肯定安利不出來,建立物件成功的話,系統是會分配記憶體的,拿記憶體來比較肯定是沒有意義的。
文中的例子是網上抄的,我也是在專案中切實遇到這個問題才去查詢的,寫下這篇,以示警記