Integer 127 == Integer 127【返回true】
Integer 128 == Integer 128【返回false】
為啥會這樣?

image.png
簡介:
Java基本類型,boolean、byte、char、short、int、float、long、double,基礎數(shù)據(jù)類型進行了對象封裝,在使用時可以自動的封箱和拆箱;
Integer是java基本類型之一,在==比較時會進行自動拆箱與封箱:
- 當Integer與int值比較時,會將Integer進行自動拆箱,intValue(),與int是常量比較;
- 當兩個Integer進行比較時,分三種情況:
1)new Integer與new Integer進行比較,則為常規(guī)對象比較,返回false;
2)Integer num = ?與new Integer進行比較,Integer num = ?會創(chuàng)建新對象,與new Integer進行比較為常規(guī)對象比較,返回false;
3)Integer num = ?與Integer num = ?進行比較,需要注意下Integer在自動封箱valueOf(int i)時,會對-128~127的值對象進行緩存,在這個范圍內為true,超出這個范圍則為兩個對象,為false。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
舉例說明:
public static void main(String[] args) {
int n1 = 127;//常量池中數(shù)值
Integer n2 = new Integer(127);
Integer n2_ = new Integer(127);
System.out.println(n2 == n2_);//false 對象比較,返回fasle
Integer n3 = 127;
System.out.println(n1 == n2);//true 與int比較,n2自動拆箱intValue(),與int是常量比較
System.out.println(n1 == n3);//true 與int比較,n3自動拆箱intValue(),與int是常量比較
System.out.println(n2 == n3);//false 對象比較,n3自動封箱valueOf(int i),返回的是自動封箱里面創(chuàng)建的對象;n2則是手動創(chuàng)建的對象,兩個引用不一樣,為false
Integer n4 = 127;
Integer n5 = 128;
Integer n6 = 128;
System.out.println(n4 == n3);//true n4,n3自動封箱值為valueOf(int i),Integer自動封箱會緩存-128~127對象,緩存對象比較為true;
System.out.println(n5 == n6);//false n5,n6自動封箱值為valueOf(int i),Integer自動封箱超過Integer自動封箱緩存-128~127范圍,為不同的對象;
}