看到博客園一位博友寫的面試問題,其中一題是 Integer a = 1; Integer b = 1 ; (a == b)?true :false; 當時我一看,這不是明顯的true 嘛, 看到評論討論才知道,對於Integer值比較 有範圍規定 。平時都是用equals做比較判斷,簡單省事。沒註意 ...
看到博客園一位博友寫的面試問題,其中一題是 Integer a = 1; Integer b = 1 ; (a == b)?true :false; 當時我一看,這不是明顯的true 嘛, 看到評論討論才知道,對於Integer值比較 有範圍規定 。平時都是用equals做比較判斷,簡單省事。沒註意到這些細節。正好趁此機會好好谷歌了一下,以此做個備份。
用以下代碼做測試
1 @Test
2 public void testInteger() {
3 Integer a = -129;
4 Integer a1 = -129;
5 Integer aaa = new Integer(-129);
6
7 Integer aa = -128;
8 Integer aa1 = -128;
9
10 System.out.println("a==a1:" + (a == a1) + "--aa==aa1:" + (aa == aa1)); // a==a1:false--aa==aa1:true
11 System.out.println("aaa==a1:" + (aaa == a1)); // aaa==a1:false
12 System.out.println("a.equals(a1):" + a.equals(a1)); // a.equals(a1):true
13
14 Integer b = 128;
15 Integer b1 = 128;
16 System.out.println("b==b1:" + (b == b1)); // b==b1:false
17 System.out.println("b.equals(b1):" + b.equals(b1)); // b.equals(b1):true
18
19 Integer c = 127;
20 Integer cc = 127;
21 Integer d = 1;
22 Integer dd = 1;
23
24 System.out.println("c==cc:" + (c == cc) + "----d==dd:" + (d == dd)); // c==cc:true----d==dd:true
25 System.out.println("------------");
26
27 Integer e = 128;
28 int e1 = 128;
29 System.out.println("e == e1:" + (e == e1)); // e == e1:true
30 }
得出的結論是 Integer 類型的值在[-128,127] 期間,Integer 用 “==”是可以的。 為什麼會出現這個情況呢,實際上在我們用Integer a = 數字;來賦值的時候Integer這個類是調用的public static Integer valueOf(int i)這個方法。
我們來看看ValueOf(int i)的代碼,可以發現他對傳入參數i做了一個if判斷。在-128<=i<=127的時候是直接用的int原始數據類型,而超出了這個範圍則是new了一個對象。我們知道"=="符號在比較對象的時候是比較的記憶體地址,而對於原始數據類型是直接比對的數據值。那麼這個問題就解決了。
還有一點需要註意到 是 Integer e = 128; int e1 = 128; e == e1:true 而 Integer b = 128; Integer b1 = 128; b==b1:false ,e=128 已經大於127了,所以e 是一個對象(new 出來的) 為什麼e = e1 是ture , 因為 int為值類型,引用類型Integer與值類型int比較顯然比較的是值因為int在堆中是不開闢記憶體的,他在棧中的值則為他本身的值所以e==e1比較的是他們各自的value, e==e1為true
總結:Integer 類型的值在[-128,127] 期間,Integer 用 “==”是可以的 , Integer 與 int 類型比較(==)比較的是值。