您好,登錄后才能下訂單哦!
這篇“Java中Integer使用的問題怎么解決”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java中Integer使用的問題怎么解決”文章吧。
很多時候我們寫的代碼可能是這樣的:
Integer num = 127; if(num==128){ //... }
這種情況下,我們拿Integer和一個數字比較的時候,是不會出什么問題。
然后如果我們這樣寫
Integer num1 = 127; num1++; Integer num2= 128; if (num1 == num2) { System.out.println(true); } else{ System.out.println(false); }
神奇的事情發生了,num1和num2雖然都是128,但是他們并不相等。
這是因為Integer的值如果是-128~127之間的時候,Integer并不會創建新的對象,而是從IntegerCache.cache中取出的,所以他們隨便比較都沒有問題。
但是如果超出了這個范圍,就不一樣了。
不信你可以試試下面的代碼:
Integer num1 = 127; Integer num2= 127; if (num1 == num2) { System.out.println(true); } else{ System.out.println(false); }
=================================
可惜的是工作中常常忘記了這一點,于是一場意外發生了。
本人前段時間寫的一段代碼中有下面一段:
String standardItemNameStr = sampleStandardItemList.stream() .filter(item -> item.getSampleId()==sample.getSampleId()) .map(item -> item.getStandardItemName()).collect(Collectors.joining("、"));
系統剛剛上線的時候一切NICE,運行很正常。突然有一天出事了。客戶跟反饋出BUG了。
本該顯示數據的地方,成了空值。
自己在本地測試,一切OK。代碼檢測了十遍以上,沒發現什么問題。
把生產環境的數據DOWN下來一跑發現其中第二行item.getSampleId()
的值是180,這時突然想起Integer的這個設定。二話不說,修改為下面的代碼,一切恢復正常。
String standardItemNameStr = sampleStandardItemList.stream() .filter(item -> item.getSampleId() .equals(sample.getSampleId())) .map(item -> item.getStandardItemName()).collect(Collectors.joining("、"));
這個問題雖然很簡單,但還是很容易忽略的。由此也擴展思考了一下,去測試一下Double、Float包裝類,并沒有catch這類的設計思路。
原因嘛應該也很簡單,Integer是整數,很多時候我們用Integer的時候需要用到的值確實是比較小的,所以官方做個catch確實能起到提高執行效率的作用,而且這個緩存命中率還是比較高的,但是小數的主要用途是在小數方面,如果要做catch的話,那數量可就太多了。
那么byte、short、long的包裝類會不會也有catch的設計呢?
補充:Java Integer比較中的那些坑
前幾天同事偶然遇到的一個問題,在list中查詢出重復的值,留下第一個,其余刪除。
ArrayList<Integer> a//a中裝有要操作的數據,都是數字 for(int i;i<a.size();i++){ //....遍歷 for(int j=i;j<a.size();j++){ if(a.get(i)==a.get(j)){ a.remove(j); } } }
然后喜聞樂見的程序出問題了:程序無法將相同的值除第一個外刪除掉。說起來這也是一個比較基礎性的問題。
int為基本類型,Integer類型為基本包裝類型。因而可以將Integer當做一個對象來理解,所以在上面的代碼示例中,用==來比較2個對象的引用無疑就是在搞笑了,地址都不一樣,怎么可能返回true。
但是這里存在著一些坑,就是Integer有時候用==比較是可以得到true的(值相同),原因如下:
在-128至127之間的賦值,Integer對象是在IntegerCache.cache產生,會復用已有對象,這個區間內的Integer值可以直接使用==進行判斷,但是這個區間之外的所有數據,都會在堆上產生,并不會復用已有對象。
所以推薦都使用equals比較。
附上int類型自動裝箱為Integer時的源代碼(IntegerCache.low為-128)
public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
這里還牽涉到了一點,就是這里為什么不直接用int類型呢?這是因為ArrayList中只接受Object對象,實際情況如下:
ArrayList al=new ArrayList(); int n=40; Integer nI=new Integer(n); al.add(n);//不可以 al.add(nI);//可以
以上就是關于“Java中Integer使用的問題怎么解決”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。