1. 程式人生 > >java中Long,Interger等引用型別的大小比較問題

java中Long,Interger等引用型別的大小比較問題

一枚java小白在上路階段遇到這樣一個問題(大佬可以直接點右上角的小叉叉),簡單描述如下: 在這裡插入圖片描述 註釋即為輸出結果,對小白來說很奇怪,這也就是為什麼有時對大寫字母開頭的型別直接 == 比較時,結果忽對忽錯。 在回答上面問題之前,我首先批判一下自己,什麼大寫字母開頭的型別,啊呸,這個叫原始型別的封裝類,好不?java對每個原始型別都提供了封裝類(大寫開頭),封裝類與原始型別有很多不同,blablablabla…網上一大堆解釋。 好了,廢話不多說,我們來看問題,要解決這個問題,我們追根溯源來看原始碼(以Long為例,其它都差不多)。 在這裡插入圖片描述 通過原始碼我們可以看出,對於-128到127的每一個數字都提前做了快取,當我們比較兩個Long型別資料是就是比較兩個物件的引用,而當資料大小位於該區間時,返回的引用型別便是已經存在cache的引用,也就是說相同的數字1,a和b實則為同一個物件的引用,所以當然相等啦。然後,當資料大小超出範圍時,就會重新new一個新的物件,雖然都是128,但c和d是不同物件的引用,所以不相等啦。 我知道當大佬們看到這裡時,內心肯定在說我low了,555555555… 實際上對於這種原始型別的封裝類進行大小比較時,沒人會直接拿 == 來比較,正確的方式時使用equals()方法來比較,該方式會將Long物件資料轉換成long型別,然後在用 == 比較,原始碼如下: 在這裡插入圖片描述

總結一下,對於原始型別的封裝類直接使用 == 來比較大小時,都有一個範圍,但是超出這個範圍便不能直接使用==,但是(重要的事情都是但是),對這種型別資料進行大小比較時,強烈建議用equals()方法。