Java中關於包裝類型容易入坑的一個點

1、問題描述

在一次對樹形結構的數據遍歷中,出現了樹形變亂的問題,在此遍歷的ID採用Long類型,在數值比較中達到某個界定值後,樹形結構變形。java

圖片描述

2、調試過程

通過debug後發現,在Long類型數值比較中使用的是 「==」 ,咋看之下沒啥問題,實際上是有問題的!在這裏Long爲包裝類,是一個對象。
在這裏回顧一下基本的知識吧:
判斷兩個對象是否爲同一對象,是經過內存中地址是否一致爲斷定的,使用 == 或.equals(obj)便可進行斷定。
那麼爲何一些數值好比一、二、三、4之類的Long對象使用==能夠正確判斷呢?數組

3、進入Long裏面查看

圖片描述
在這裏咱們能夠看到Long類型的數值從-128~127 在一開始已經放進去了靜態代碼塊裏面的cache數組裏面,
而基本包裝類型在自動裝箱成包裝類型的時候會從緩存裏面取:緩存

圖片描述

能夠看到在數字大於-128 或 小於127的時候,是直接從cache裏面取出來的,因此在這個數值範圍內的Long類型對象是能夠直接進行比較的,可是超出了這個範圍,就會new 新的Long類型,這就致使使用 == 判斷不正確,也就是樹形結構在id超出127後就發生了變化。使用包裝類重寫過的equals方法就能夠正確對包裝類型的數值正確進行判斷了。spa

4、後續結語

後來在查看《阿里巴巴java開發規範》時候也看到了:debug

圖片描述

這些不止是適用於Integer或是Long,全部包裝類都適用。調試

有些問題雖然不大,可是倒是值得咱們去深思的 。 加油。 :)對象

相關文章
相關標籤/搜索