首頁  >  文章  >  Java  >  integer與int區別以及integer.values()方法詳解

integer與int區別以及integer.values()方法詳解

巴扎黑
巴扎黑原創
2017-06-26 10:20:011555瀏覽

聲明:本文為部落客轉載文章,原文網址見文末。

知識點1:integer與int的差異

/*
 * int是java提供的8種原始資料型別之一。 Java為每個原始類型提供了封裝類,Integer是java為int提供的封裝類別。 int的預設值為0,
 * 而Integer的預設值為null
 * ,即Integer可以區分出未賦值和值為0的區別,int則無法表達出未賦值的情況,例如,若要表達出沒有參加考試和考試成績為0的區別
 * ,則只能使用Integer
* 。在JSP開發中,Integer的預設值為null,所以用el表達式在文字方塊中顯示時,值為空白字串,而int預設的預設值為0,所以用el表達式在文字方塊中顯示時
 * ,結果為0,所以,int不適合作為web層的表單資料的型別。
 * 在Hibernate中,如果將OID定義為Integer類型,那麼Hibernate就可以根據其值是否為null而判斷一個物件是否是臨時的
# * ,如果將OID定義為了int類型,還需要在hbm映射檔中設定其unsaved-value屬性為0。
 * 另外,Integer提供了多個與整數相關的操作方法,例如,將一個字串轉換成整數,Integer中也定義了表示整數的最大值和最小值的常數。

 */

 

#知識點2:integer.values()方法詳解

##

為什麼第一個判斷回傳了true而第二個判斷回傳了false127128有什麼我不知道的差別嗎? (當然除了127小於128…)

##還有,為什麼第三個判斷會返回了

true我看了另一個相關提問的回答,但是我還是不知道它們什麼時候回傳true還有為什麼第二個判斷回傳
false

  回答#1:

#Integer.valueOf(String)確有一個不尋常的行為。

valueOf會傳回一個Integer(整數)對象,當被處理的字串在-128127(包含邊界)之間時,傳回的物件是預先快取的。這就是為什麼第一行的呼叫會回傳true-127

#這個整數物件是被快取的(所以兩次

valueOf傳回的是同一個物件)-第二行的呼叫返回false是因為128沒有被緩存,所以每次調用,都會產生一個新的整型對象,

因此兩個

128整數物件是不同的物件。

重要的是你要知道在上面的比較中,你實際進行比較的是integer.valueOf傳回的物件引用,所以當你比較快取外的整數物件時,相等的判斷不會回傳true,就算你

傳個

valueOf的值是相等的也沒用。 (就像第二行中Integer.valueOf(128)==Integer.valueOf(128))。想讓這個判斷回傳true,你需要使用equals()方法。

parseInt()傳回的不是整數對象,而是一個int型基礎元素。這就是為什麼最後一個判斷會回傳true,第三行的判斷中,在判斷相等時,實際比較的是128 == 128

所以它必然是相等的。

再來來說第三種比較中的一點區別,使得它的結果與第二種比較不一樣了:

一個unboxing conversion(一種比較時的轉換,把對物件的引用轉換為其對應的原子類型)在第三行的比較中發生了。因為比較運算子使用了

==同時等號的兩邊

存在一個

int型態和一個Integer物件的參考。這樣的話,等號右邊回傳的Integer物件被進一步轉換成了int數值,才與左邊進行相等判斷。

所以在轉換完成後,你實際比較的是兩個原子整數數值。這個轉換正是你在比較兩個原子類型時所期待看到的那樣,所以你最終比較了

128等於128

 

  回答#2:

Integer類別有一個靜態緩存,儲存了256個特殊的 Integer物件-每個物件分別對應`-128 和127之間的一個值。 有了這個概念,就可以知道上面三行程式碼之間的差異。

#1
2
3
System.out.println(Integer.valueOf("127")==Integer.valueOf("127" ));
System.out.println(Integer.valueOf("128")==Integer.valueOf( "128"));
System.out.println(Integer.parseInt("128")==Integer.valueOf("128"));

顯示建立了一個新的Integer物件。

1
#new Integer(123);
1
#Integer.parseInt( "123");

解析完字串後傳回一個int值。

1
#Integer.valueOf( "123");

#這種情況比其他的要更複雜一些。首先進行了字串解析,然後如果解析的值位於-128127之間,就會從靜態快取中傳回物件。如果超出了這個範圍,就會呼叫

Integer()方法並將解析的值作為參數傳入,得到一個新的物件。

現在,讓我們來看看問題中的3個表達式。

1
#Integer.valueOf( "127")==Integer.valueOf("127"#);

#上面的表達式傳回true,因為Integer的值從靜態快取中取了2次,表達式傳回了物件與自己比較的結果。因為只有一個Integer對象,所以回傳結果為true

1
#Integer.valueOf( "128")==Integer.valueOf("128"#);
#

上面的表達式傳回false,因為128沒有存在靜態緩衝區。所以每次在判斷相等時等式兩邊都會建立新的Integer物件。由於兩個Integer物件不同,所以==只有等式

兩邊代表同一個物件時才會回傳true。因此,上面的等式返回false

1
#Integer.parseInt( "128")==Integer.valueOf("128"#);

#上面的表達式比較的是左邊的原始int128與右邊新建立的Integer 物件。但因為intInteger之間比較是沒有意義的,所以Java在進行比較之前會將Integer

自動拆箱,所以最後進行的是intint值之間的比較。由於128和自己相等,所以回傳true。 

以上是integer與int區別以及integer.values()方法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:Java中關鍵字volatile 和 synchronized 的作用和區別下一篇:Java中關鍵字volatile 和 synchronized 的作用和區別

相關文章

看更多