一.Integer 類型對象之間大小比較java
1. 使用 new Integer() 建立的對象 :緩存
首先,咱們知道,在java中,基本類型之間是能夠作大小比較的,例如int i=1,int j=2,是能夠直接使用關係運算符「<」、「>」、「==」等符號來作比較的。但在實際開發中,基本類型的包裝類更爲經常使用,那麼包裝類型的比較運算是如何呢?spa
在main方法中執行下面代碼:對象
Java代碼 開發
有人可能會說,jdk1.5之後,基本類型和包裝類型之間是能夠自由轉換的,那麼Integer對象也能夠直接用關係運算符來作比較,但實際狀況並不是這樣。執行上述代碼,打印結果是:源碼
falsejdk
其實緣由很簡單,上述代碼中咱們執行了兩次new,因此建立了兩個Integer型的對象,對象之間的「==」符是用來比較是不是一個對象的兩個引用(即比較地址是否相同),上述代碼中,兩次new出來的對象地址顯然是不可能相同的,故打印結果是false。語法
那麼對於「<」、「>」這樣的運算符呢?執行下面代碼:引用
Java代碼 方法
打印結果是true,通過實驗,對於「<=」、「>=」符號也是同樣的
結論1:使用new關鍵字建立的包裝類型對象,不能夠直接使用「==」來作大小比較,但可使用「<」、「>」、「<=」、「>=」來作大小比較。
2. 使用 Integer.valueOf() 建立的對象
固然,建立包裝類型對象不必定非要使用new關鍵字,以Integer爲例,咱們可使用Integer.valueOf()方法建立Integer對象。那麼這種方法建立的對象如何作大小比較呢?執行下面的代碼:
Java代碼
執行後,咱們發現,打印結果是true。
根據這個結果,咱們是否能夠認爲,經過valueOf方法建立的對象,能夠直接使用關係運算符作比較呢?
先別急,再執行一段代碼:
Java代碼
這段代碼,打印結果竟然是false!
那麼對於「<」、「>」、「<=」、「>=」這幾個符號呢?經過實驗,得出的結論和1中相同,這幾個符號仍然能夠直接使用。
看來咱們又能夠得出一個結論,
結論2:經過valueOf方法建立的Integer對象,也不能隨便使用「==」比較大小,但可使用「<」、「>」、「<=」、「>=」來作大小比較。
3. 使用基本類型賦值建立的對象
相比前兩種方法,咱們平時更經常使用的是直接將基本類型對象賦值給包裝類型(即自動裝箱),好比Integer i = 100這樣的語法。那麼經過這種方法建立的對象,能否使用關係運算符來比較大小呢?
Java代碼
執行上面的代碼,發現打印結果是true。固然有了2中的經驗,咱們使用400這個數來再試一次:
Java代碼
執行這段代碼後,發現和2中狀況同樣,仍然打印false;
經過實驗,對於「<」、「>」、「<=」、「>=」這幾個符號,和上面的狀況都是同樣的。
結論3:使用Integer i = 400這種方法建立的包裝類對象,也不能隨便使用「==」來比較大小,但可使用「<」、「>」、「<=」、「>=」來作大小比較。
這些現象是什麼緣由致使的呢?請看下面的分析。
二。Integer 對象不一樣建立方法之間的區別
上文得出的三個小結論,都說明了一個問題,包裝類型是不可以隨便使用關係運算符比較大小的,針對三種建立對象的方法,緣由分析以下:
首先,對於new關鍵字建立的包裝類對象,緣由在上文已經說過了,兩次new獲得的對象引用地址是不一樣的,不能使用「==」關鍵字作大小比較。而使用「& lt;」和「>」等運算符時,包裝類型會調用valueOf方法,將運算符兩邊的對象都轉換爲基本類型後再作比較。這就是爲什麼「==」不能使用而 「<」、「>」、「<=」、「>=」這幾個符號可使用的緣由。
第二,使用valueOf方法建立的Integer對象,使用「==」符號時,運行結果有時候正確,有時候不正確。查看valueOf方法的源碼,以下:
Java代碼
經過看源碼可以知道,整數類型在-128~127之間時,會使用緩存,形成的效果就是,若是已經建立了一個相同的整數,使用valueOf建立第二次時, 不會使用new關鍵字,而用已經緩存的對象。因此使用valueOf方法建立兩次對象,若對應的數值相同,且數值在-128~127之間時,兩個對象都指 向同一個地址。
最後,使用Integer i = 400這樣的方式來建立Integer對象,與valueOf方法的效果是同樣的,再也不贅述。
總之,包裝類對象不可以使用「==」符作比較運算,若是要進行比較運算時,最好使用java類庫中的compareTo方法