1.我們都知道基本類型(int,long鄧)通過==比較的是他們的值大小车酣,而引用類型比較的是他們的引用地址
2.當(dāng)我們給一個Integer賦予一個int類型的時候會調(diào)用Integer的靜態(tài)方法valueOf()方法也就是自動裝箱
直接上代碼:
public class TestEquals {
public static void main(String[] args) {
int int1 = 12;
Integer i1 = new Integer(12);
Integer i2 = new Integer(12);
Integer i3 = new Integer(127);
Integer a1 = 127;//相當(dāng)于 Integer.valueOf(127);
Integer a2 = 127;
Integer y = 128;
Integer z = 128;
/**
* true
* Integer是int的封裝類懂扼,當(dāng)Integer與int進(jìn)行==比較時期贫,Integer就會拆箱成一個int類型客给。
* 所以還是相當(dāng)于兩個int類型進(jìn)行比較晶丘,這里的Integer,不管是直接賦值有序,還是new創(chuàng)建的對象握巢,只要跟int比較就會拆箱為int類型晕鹊,所以就是相等的。
*/
System.out.println("int1 == i1 -> " + (int1 == i1));
/**
* false
* 這是兩個都是對象類型暴浦,而且不會進(jìn)行拆箱比較溅话,所以不等
*/
System.out.println("i1 == i2 -> " + (i1 == i2));
/**
* false
* 這個比較好理解
* i3是新創(chuàng)建的對象,而a1=127會自動裝箱調(diào)用Integer.valueOf方法返回Integer對象歌焦,這個是IntegerCache.cache返回的緩存Integer對象飞几,所以兩個對象不相等。
*
*/
System.out.println("i3 == a1 -> " + (i3 == a1));
/**
* true
* 很好理解独撇,都是127 自動裝箱循狰,返回的是同一個對象
*/
System.out.println("a1 == a2 -> " + (a1 == a2));
/**
* false
* 都是128,超過了IntegerCache.high=127券勺,所以返回的都是新創(chuàng)建的Integer對象
*/
System.out.println("y == z -> " + (y == z));
}
}
當(dāng)我們給一個Integer賦予一個int類型的時候會調(diào)用Integer的靜態(tài)方法valueOf绪钥。
源碼:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
這里面可以看到,當(dāng)傳遞的i的大小在IntegerCache.low~IntegerCache.high之間的時候关炼,是返回的緩存里面的數(shù)據(jù)程腹。超出范圍就是直接創(chuàng)建的一個新的Integer對象。
Integer.java
min-max.jpg
2021-04-19_164240.jpg
由圖可知儒拂,在Integer類加載的時候會初始化IntegerCache類寸潦,從而初始化里面的static {}塊色鸳,從而初始化IntegerCache.cache[]變量(-128~127)。
總結(jié):int在進(jìn)行自動裝箱的時候见转,調(diào)用了Integer.valueOf方法命雀,當(dāng)i在-128~127范圍內(nèi)是從IntegerCache中直接獲取,當(dāng)超越這個范圍才會new 一個新的Integer對象返回斩箫。