Integer和int使用==進行比較大小時的坑


先看一個例子:

public static void main(String[] args) {
  int i1 = 128;
  Integer i2 = 128;
  Integer i3 = new Integer(128);
  System.out.println(i1 == i2);//true
  System.out.println(i1 == i3);//true
  System.out.println("**************************************");


  Integer i4 = 127;
  Integer i5 = 127;
  Integer i6 = 128;
  Integer i7 = 128;
  System.out.println(i4 == i5);//true
  System.out.println(i6 == i7);//false
  System.out.println("**************************************");


  Integer i8 = new Integer(127);
  Integer i9 = new Integer(127);
  System.out.println(i8 == i9);//false
  System.out.println(i8.equals(i9));//true
  System.out.println(i4 == i8);//false

}

/* Output:
  true
  true
**************************************
  true
  false
**************************************
  false
  true
  false
*/

解析:第5和第6行的結果都為true。因為Integer和int比較時,Integer會自動拆箱(jdk1.5以上)。

第12行結果為true,第13行結果為false。因為Java在編譯的時候,Integer i4=127被編譯成-->Integer i4 = Integer.valueOf(127);

查看JDK源碼:

public static Integer valueOf(int i){

  if (i >= IntegerCache.low && i <= IntegerCache.high)
  return IntegerCache.cache[i + (-IntegerCache.low)];
  return new Integer(i);

}

得知,對於-128到127之間的數,會進行緩存,Integer i6 = 127時,會將127進行緩存,下次再寫Integer i7 = 127時,就會直接從緩存中取,就不會新new對象了。

i8、i9使用的是new,對象不一樣,所以第17行結果為false,第18行結果為true,第19行為false。

總結:

1、Integer是int的包裝類,int的初始值為0,Integer的初始值為null;

2、無論如何,Integer和new Integer()不會相等。不會經歷拆箱過程,i8的引用指向堆,而i4指向專門存放他的內存(常量池),他們的內存地址不一樣,使用== 比較都為false。

3、兩個非new出來的Integer,使用==比較,如果在-128到127之間,則是true,否則為false;

4、兩個都是new出來的Integer,==比較都為false。若要比較值是否相等,需使用equals()方法進行比較;

5、int和Integer(無論是否是new出來的)比較,都為true,因為Integer會自動拆箱為int再去比較;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM