從Integer(Long)的比較說開去
Java
在我們的項目中,一些開發人員喜歡在Entity、DTO、VO等實體類中把數字設置成Integer、Long等包裝類。而我們的架構師糾正了很多次,只讓用int、long這些基本數據類型。他說:使用包裝類,在比較的時候可能會出錯。
這個說法我之前看資料的時候看到過,但是沒有詳細地去探究,最近查看了源代碼,說說這裡面的成因。
先說現象
測試1
結果是true。
測試2
結果是false。
當改成
測試3
無論Integer是多少(在合理範圍內),結果都是true。
測試3比較好理解,因為直接用基礎數據類型int進行比較。但是測試1、2很多人就不明白了。
理論上講,都是new出來的對象,內存地址不一致,而==在比較對象的時候,比較的就是內存地址。
所以測試1結果是true,這個結果是錯的,而測試2的結果是false,這才是正確的。
為什麼會出現這種現象呢?
原因就在於Integer內部有一個私有嵌套類IntegerCache,如果沒有進行特別設置的話,在初次使用時會初始化一個緩存數組,範圍是-128~127(Integer可以設置這個範圍值,Long等不可以)。
也就是說當我們在兩個Integer對象用==比較的時候,如果值是在-128~127範圍內,會從IntegerCache里取值對比,內存地址一樣,所以==的結果為true(測試1)。
如果超過這個範圍,比對的就是兩個對象的內存地址,==結果為false(測試2)
所以使用Integer、Long這些包裝類進行對比的時候,應該用equals(),如果用==,也要使用intValue()。
=============================================================================
據此再說開一點。
將字元串轉為數字,有兩種方法:
int i = Integer.parseInt("1");
int j = Integer.valueOf("2");
效果一致,但使用前者比較好,因為是直接將字元串轉為int。
而後者是通過前者將字元串轉為int,再封裝成Integer,再拆成int,賦值給j,多了無謂的封箱拆箱動作。
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
TAG:Java個人學習心得 |