聲明:本文為博主轉載文章,原文地址見文末。
知識點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()方法詳解
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"
));
|
為什么第一個判斷返回了true
而第二個判斷返回了false
?127
和128
有什么我不知道的區別嗎?(當然除了127
小於128
…)
還有,為什么第三個判斷返回了true
?
我看了另一個相關提問的回答,但是我還是不知道它們什么時候返回true還有為什么第二個判斷返回false
。
回答#1:
Integer.valueOf(String)
確有一個不同尋常的行為。
valueOf
會返回一個Integer
(整型)對象,當被處理的字符串在-128
和127
(包含邊界)之間時,返回的對象是預先緩存的。這就是為什么第一行的調用會返回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
|
new Integer(123);
|
顯示創建了一個新的Integer
對象。
1
|
Integer.parseInt(
"123"
);
|
解析完字符串后返回一個int
值。
1
|
Integer.valueOf(
"123"
);
|
這種情況比其他的要更復雜一些。首先進行了字符串解析,然后如果解析的值位於-128
和127
之間,就會從靜態緩存中返回對象。如果超出了這個范圍,就會調用
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"
);
|
上面的表達式比較的是左邊的原始int
值128
與右邊新創建的Integer
對象。但是因為int
和Integer
之間比較是沒有意義的,所以Java在進行比較前會將Integer
自動拆箱,所以最后進行的是int
和int
值之間的比較。由於128
和自己相等,所以返回true
。
integer和int區別轉自:絕地反擊T博客
原文鏈接: stackoverflow 翻譯: ImportNew.com - 靳禹
譯文鏈接: http://www.importnew.com/9162.html