首先給大家看一個(gè)例子:
1
public class Test {
2
3
/**
4
* 關(guān)于Integer大小比較問題
5
* @author 經(jīng)理
6
*/
7
public static void 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
運(yùn)行一下,在控制臺(tái)得到的結(jié)果是這樣的
2

3

4

5

6

7

8

9

10

11

12

13

14



當(dāng)是當(dāng)我們變換一下值
1
public class Test {
2
3
/**
4
* 關(guān)于Integer大小比較問題
5
* @author 經(jīng)理
6
*/
7
public static void 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
}

2

3

4

5

6

7

8

9

10

11

12

13

運(yùn)行一下,控制臺(tái)的結(jié)果又是


這是什么原因呢?我當(dāng)時(shí)也有點(diǎn)犯糊涂。有點(diǎn)沖動(dòng)就直接開源碼看了。
實(shí)際上在我們用Integer a = 數(shù)字;來賦值的時(shí)候Integer這個(gè)類是調(diào)用的public static Integer valueOf(int i)這個(gè)方法。
1
public static Integer valueOf(int i) {
2
if(i >= -128 && i <= IntegerCache.high)
3
return IntegerCache.cache[i + 128];
4
else
5
return new Integer(i);
6
}
我們來看看ValueOf(int i)的代碼,可以發(fā)現(xiàn)他對(duì)傳入?yún)?shù)i做了一個(gè)if判斷。在-128<=i<=127的時(shí)候是直接用的int原始數(shù)據(jù)類型,而超出了這個(gè)范圍則是new了一個(gè)對(duì)象。我們知道"=="符號(hào)在比較對(duì)象的時(shí)候是比較的內(nèi)存地址,而對(duì)于原始數(shù)據(jù)類型是直接比對(duì)的數(shù)據(jù)值。那么這個(gè)問題就解決了。
2

3

4

5

6

至于為什么用int型的時(shí)候值會(huì)在-128<=i<=127范圍呢呢?我們知道八位二進(jìn)制的表示的范圍正好就是-128到127。大概就是因?yàn)檫@吧。
把平時(shí)出現(xiàn)的問題記錄下來,自己就可以一點(diǎn)一點(diǎn)進(jìn)步了。