,Ingeter是int的包裝類,int的初值為0,Ingeter的初值為null。但是如果面試官再問一下Integer i = 1;int ii = 1; i==ii為true還是為false?
首先看代碼:
1 package com.test;
2 /**
4 * @author
5 *
6 */
7 public class TestInteger {
8
9 /**
10 * @param args
11 */
12 public static void main(String[] args) {
13 int i = 128;
14 Integer i2 = 128;
15 Integer i3 = new Integer(128);
16 //Integer會自動拆箱為int,所以為true
17 System.out.println(i == i2);
18 System.out.println(i == i3);
19 System.out.println("**************");
20 Integer i5 = 127;//java在編譯的時候,被翻譯成-> Integer i5 = Integer.valueOf(127);
21 Integer i6 = 127;
22 System.out.println(i5 == i6);//true
23 /*Integer i5 = 128;
24 Integer i6 = 128;
25 System.out.println(i5 == i6);//false
26 */ Integer ii5 = new Integer(127);
27 System.out.println(i5 == ii5); //false
28 Integer i7 = new Integer(128);
29 Integer i8 = new Integer(123);
30 System.out.println(i7 == i8); //false
31 }
32
33 }
首先,17行和18行輸出結果都為true,因為Integer和int比都會自動拆箱(jdk1.5以上)。
22行的結果為true,而25行則為false,很多人都不動為什么。其實java在編譯Integer i5 = 127的時候,被翻譯成-> Integer i5 = Integer.valueOf(127);所以關鍵就是看valueOf()函數了。只要看看valueOf()函數的源碼就會明白了。JDK源碼的valueOf函數式這樣的:
1 public static Integer valueOf(int i) {
2 assert IntegerCache.high >= 127;
3 if (i >= IntegerCache.low && i <= IntegerCache.high)
4 return IntegerCache.cache[i + (-IntegerCache.low)];
5 return new Integer(i);
6 }
看一下源碼大家都會明白,對於-128到127之間的數,會進行緩存,Integer i5 = 127時,會將127進行緩存,下次再寫Integer i6 = 127時,就會直接從緩存中取,就不會new了。所以22行的結果為true,而25行為false。
對於27行和30行,因為對象不一樣,所以為false。
我對於以上的情況總結如下:
①無論如何,Integer與new Integer不會相等。不會經歷拆箱過程,i3的引用指向堆,而i4指向專門存放他的內存(常量池),他們的內存地址不一樣,所以為false
②兩個都是非new出來的Integer,如果數在-128到127之間,則是true,否則為false
java在編譯Integer i2 = 128的時候,被翻譯成-> Integer i2 = Integer.valueOf(128);而valueOf()函數會對-128到127之間的數進行緩存
③兩個都是new出來的,都為false
④int和integer(無論new否)比,都為true,因為會把Integer自動拆箱為int再去比
public static void main(String[] args) {
int a = 1;
Integer a1 = 1;
System.out.println(a1 == a);// true a1自動拆箱
int b = 128;
Integer b1 = 128;
System.out.println(b1 == b);// true
Integer c = 1;
Integer c1 = new Integer(1);
Integer c2 = new Integer(2);
System.out.println(c == c1);// false c指向常量池,c1指向堆
System.out.println(c1 == c2);// false 兩個不同的對象
Integer d = 127;
Integer d1 = 127;
Integer d2 = 128;
Integer d3 = 128;
System.out.println(d == d1);// true 執行Integer.valueof()方法
// -128到127之間的數會有緩存,從緩存中取值,不會new
System.out.println(d2 == d3);// false 沒緩存會new
}

