困惑的地方
先貼上代碼,顯示讓我一開始很困惑的地方
package com.lizi.basic;
public class IntegerDemo {
public static void main(String[] args) {
Integer a = new Integer(3);
Integer b = 3;
int c = 3;
System.out.println(a == b);
System.out.println(a == c);
Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2);
System.out.println(f3 == f4);
}
}
你們覺得應該是什麼?水很深的哦
false
true
true
false
分析思路
先分析 Integer a = 數值 之間如何比較;
再分析 Integer 與 int 如何比較
Java 資料兩種類型 – 基本類型的應用類型
- 基本類型
- 基本資料類類型存的是數值本身
- 引用類型
- 引用類型變量在記憶體放的是資料的引用
基本類型通過 == 比較的是他們的值大小,而引用類型比較的是他們的引用位址
Integer 用 == 比較的時候往往非常容易出錯
100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2);
System.out.println(f3 == f4);
當我們給一個Integer賦予一個int類型的時候會調用Integer的靜态方法valueOf。
Integer f1 = Integer.valueOf(100);
Integer f2 = Integer.valueOf(100);
Integer f3 = Integer.valueOf(150);
Integer f4 = Integer.valueOf(150);
思考:那麼
Integer.valueOf()
傳回的
Integer
是不是是重新
new Integer(num);
來建立的呢?如果是這樣的話,那麼== 比較傳回都是false,因為他們引用的堆位址不一樣
具體來看看
Integer.valueOf
的源碼
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new
在IntegerCache中cache數組初始化如下,存入了-128 - 127的值
new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new
從上面我們可以知道給Interger 賦予的int數值在-128 - 127的時候,直接從cache中擷取,這些cache引用對Integer對象位址是不變的,但是不在這個範圍内的數字,則new Integer(i) 這個位址是新的位址,不可能一樣的
Integer 與 int
Integer a = new Integer(3);
Integer b = 3;
int c = 3;
System.out.println(a == b);
System.out.println(a == c);
a == b分析
Integer b = 3;
自動調用
Integer.valueOf(3)
傳回一個
Integer
的對象。 這個對象存放到
cache
中的
而
Integer a = new Integer(3);
這裡建立了一個新的對象
Integer
是以 a == b 傳回的是
false
a == c 分析
一個Integer 與 int比較,先将Integer轉換成int類型,再做值比較,是以傳回的是true