日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Integer.valueOf(String) 方法之惑

發布時間:2024/9/30 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Integer.valueOf(String) 方法之惑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.importnew.com/9162.html


Importnew注:如果你也對Java技術翻譯分享感興趣,歡迎加入我們的Java開發小組。參與方式請查看小組簡介。

有個仁兄在 StackOverflow 上發起了一個問題,是這么問的:

“ 我被下面的代碼搞暈了,為什么它們會返回不同的值?”

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"));

輸出是:

1 2 3 true false true

為什么第一個判斷返回了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。

原文鏈接:? stackoverflow ?翻譯:? ImportNew.com? -? 靳禹
譯文鏈接:? http://www.importnew.com/9162.html
[? 轉載請保留原文出處、譯者和譯文鏈接。 ]

總結

以上是生活随笔為你收集整理的Integer.valueOf(String) 方法之惑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。