Integer 類型對象之間大小比較

一.Integer 類型對象之間大小比較java

1.  使用 new Integer() 建立的對象 :緩存

首先,咱們知道,在java中,基本類型之間是能夠作大小比較的,例如int i=1,int j=2,是能夠直接使用關係運算符「<」、「>」、「==」等符號來作比較的。但在實際開發中,基本類型的包裝類更爲經常使用,那麼包裝類型的比較運算是如何呢?spa

在main方法中執行下面代碼:對象

Java代碼  開發

  1. Integer i = new Integer(100);  
  2. Integer j = new Integer(100);  
  3. System.out.println(i==j);  

 

有人可能會說,jdk1.5之後,基本類型和包裝類型之間是能夠自由轉換的,那麼Integer對象也能夠直接用關係運算符來作比較,但實際狀況並不是這樣。執行上述代碼,打印結果是:源碼

falsejdk

其實緣由很簡單,上述代碼中咱們執行了兩次new,因此建立了兩個Integer型的對象,對象之間的「==」符是用來比較是不是一個對象的兩個引用(即比較地址是否相同),上述代碼中,兩次new出來的對象地址顯然是不可能相同的,故打印結果是false。語法

那麼對於「<」、「>」這樣的運算符呢?執行下面代碼:引用

Java代碼  方法

  1. Integer i = new Integer(100);  
  2. Integer j = new Integer(300);  
  3. System.out.println(i<j);  

 

打印結果是true,通過實驗,對於「<=」、「>=」符號也是同樣的

結論1:使用new關鍵字建立的包裝類型對象,不能夠直接使用「==」來作大小比較,但可使用「<」、「>」、「<=」、「>=」來作大小比較。

2.   使用 Integer.valueOf() 建立的對象

固然,建立包裝類型對象不必定非要使用new關鍵字,以Integer爲例,咱們可使用Integer.valueOf()方法建立Integer對象。那麼這種方法建立的對象如何作大小比較呢?執行下面的代碼:

Java代碼  

  1. Integer i = Integer.valueOf(100);  
  2. Integer j = Integer.valueOf(100);  
  3. System.out.println(i==j);  

 

執行後,咱們發現,打印結果是true。

根據這個結果,咱們是否能夠認爲,經過valueOf方法建立的對象,能夠直接使用關係運算符作比較呢?

先別急,再執行一段代碼:

Java代碼  

  1. Integer i = Integer.valueOf(400);  
  2. Integer j = Integer.valueOf(400);  
  3. System.out.println(i==j);  

 

這段代碼,打印結果竟然是false!

那麼對於「<」、「>」、「<=」、「>=」這幾個符號呢?經過實驗,得出的結論和1中相同,這幾個符號仍然能夠直接使用。

看來咱們又能夠得出一個結論,

結論2:經過valueOf方法建立的Integer對象,也不能隨便使用「==」比較大小,但可使用「<」、「>」、「<=」、「>=」來作大小比較。

3. 使用基本類型賦值建立的對象

相比前兩種方法,咱們平時更經常使用的是直接將基本類型對象賦值給包裝類型(即自動裝箱),好比Integer i = 100這樣的語法。那麼經過這種方法建立的對象,能否使用關係運算符來比較大小呢?

Java代碼  

  1. Integer i = 100;  
  2. Integer j = 100;  
  3. System.out.println(i==j);  

 

執行上面的代碼,發現打印結果是true。固然有了2中的經驗,咱們使用400這個數來再試一次:

Java代碼  

  1. Integer i = 400;  
  2. Integer j = 400;  
  3. System.out.println(i==j);  

 

執行這段代碼後,發現和2中狀況同樣,仍然打印false;

經過實驗,對於「<」、「>」、「<=」、「>=」這幾個符號,和上面的狀況都是同樣的。

結論3:使用Integer i = 400這種方法建立的包裝類對象,也不能隨便使用「==」來比較大小,但可使用「<」、「>」、「<=」、「>=」來作大小比較。

這些現象是什麼緣由致使的呢?請看下面的分析。

二。Integer 對象不一樣建立方法之間的區別

上文得出的三個小結論,都說明了一個問題,包裝類型是不可以隨便使用關係運算符比較大小的,針對三種建立對象的方法,緣由分析以下:

首先,對於new關鍵字建立的包裝類對象,緣由在上文已經說過了,兩次new獲得的對象引用地址是不一樣的,不能使用「==」關鍵字作大小比較。而使用「& lt;」和「>」等運算符時,包裝類型會調用valueOf方法,將運算符兩邊的對象都轉換爲基本類型後再作比較。這就是爲什麼「==」不能使用而 「<」、「>」、「<=」、「>=」這幾個符號可使用的緣由。

第二,使用valueOf方法建立的Integer對象,使用「==」符號時,運行結果有時候正確,有時候不正確。查看valueOf方法的源碼,以下:

Java代碼  

  1. public static Integer valueOf(int i) {    
  2.        if(i >= -128 && i <= IntegerCache.high)    
  3.            return IntegerCache.cache[i + 128];    
  4.        else    
  5.            return new Integer(i);    
  6. }    

 

經過看源碼可以知道,整數類型在-128~127之間時,會使用緩存,形成的效果就是,若是已經建立了一個相同的整數,使用valueOf建立第二次時, 不會使用new關鍵字,而用已經緩存的對象。因此使用valueOf方法建立兩次對象,若對應的數值相同,且數值在-128~127之間時,兩個對象都指 向同一個地址。

最後,使用Integer i = 400這樣的方式來建立Integer對象,與valueOf方法的效果是同樣的,再也不贅述。

總之,包裝類對象不可以使用「==」符作比較運算,若是要進行比較運算時,最好使用java類庫中的compareTo方法

相關文章
相關標籤/搜索