“equals”比較
equals(Object obj)方法,在equals(Object obj)方法中,會先判斷參數中的對象obj是否是Integer同類型的對象,如果是則判斷值是否相同,值相同則返回true,值不同則返回false,如果obj不是Integer類的對象,則返回false。
需要注意的是:當參數是基本類型int時,編譯器會給int自動裝箱成Integer類,然后再進行比較。
1. 基本類型(值類型)之間無法使用equals比較。
2. equals參數為值類型,則參數會進行自動裝箱為包裝類型,之后請參見第3點。
3. equals參數為包裝類型,則先比較是否為同類型,非同類型直接返回false,同類型再比較值。
示例:
new Long(0).equals(0) 為 false,equals參數默認為int類型,裝箱為Integer類型,不同類型直接返回false
new Integer(500).equals(500) 為 true,equals參數默認為int類型,裝箱為Integer類型,相同類型再比較值返回true
new Integer(500).equals((short)500) 為 false,equals參數為byte類型,裝箱為Byte類型,不同類型直接返回false
new Long(0).equals(0L) 為 true,equals參數為long類型,裝箱為Long類型,相同類型再比較值返回true
“==”比較
1. 基本類型之間互相比較:以值進行比較
2. 一邊是基本類型,一邊是包裝類型
1) 同類型的進行比較,如Integer 與int,Long與long進行==比較時,會自動拆箱比較值
2) 不同類型之間進行比較,則會自動拆箱,且會進行自動向上轉型再比較值(低級向高級是隱式類型轉換如:byte<short<int<long<float<double,高級向低級必須強制類型轉換)
3. 兩邊都是包裝類型則直接比較引用地址,但是要注意IntegerCache除外。
IntegerCache 緩存
JAVA的Integer有IntegerCache會緩存-128~127之間的對象。
如:Integer x = 100,會調用Integer的valueOf()方法,這個方法就是返回一個Integer對象,但是在返回前,作了一個判斷,判斷要賦給對象的值是否在[-128,127]區間中,且IntegerCache(是Integer類的內部類,里面有一個Integer對象數組,用於存放已經存在的且范圍在[-128,127]中的對象)中是否存在此對象,如果存在,則直接返回引用,否則,創建一個新對象返回。
Integer i02 = 59; Integer i03 = Integer.valueOf(59); Integer i04 = new Integer(59); System.out.println(i02 == i03); //true 因為59位於緩存區間直接從緩存中獲取 System.out.println(i02 == i04); //false System.out.println(i03 == i04); //false
Integer i02 = 200; Integer i03 = Integer.valueOf(200); Integer i04 = new Integer(200); System.out.println(i02 == i03); //false 因為200超出緩存區間從新創建對象 System.out.println(i02 == i04); //false System.out.println(i03 == i04); //false
所以在一般情況下,建議用int,除非特殊需要要賦null值才使用包裝類Integer。