當前位置:
首頁 > 知識 > 從Integer(Long)的比較說開去

從Integer(Long)的比較說開去

從Integer(Long)的比較說開去

Java

在我們的項目中,一些開發人員喜歡在Entity、DTO、VO等實體類中把數字設置成Integer、Long等包裝類。而我們的架構師糾正了很多次,只讓用int、long這些基本數據類型。他說:使用包裝類,在比較的時候可能會出錯。

這個說法我之前看資料的時候看到過,但是沒有詳細地去探究,最近查看了源代碼,說說這裡面的成因。

先說現象

從Integer(Long)的比較說開去

測試1

結果是true。

從Integer(Long)的比較說開去

測試2

結果是false。

當改成

從Integer(Long)的比較說開去

測試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,多了無謂的封箱拆箱動作。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Java個人學習心得 的精彩文章:

TAG:Java個人學習心得 |