溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中Integer使用的問題怎么解決

發(fā)布時(shí)間:2022-11-11 09:31:32 來源:億速云 閱讀:183 作者:iii 欄目:開發(fā)技術(shù)

這篇“Java中Integer使用的問題怎么解決”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java中Integer使用的問題怎么解決”文章吧。

很多時(shí)候我們寫的代碼可能是這樣的:

Integer num = 127;
if(num==128){
	//...
}

這種情況下,我們拿Integer和一個(gè)數(shù)字比較的時(shí)候,是不會(huì)出什么問題。

然后如果我們這樣寫

Integer num1 = 127;
num1++;
Integer num2=  128;
if (num1 == num2) {
    System.out.println(true);
}
else{
    System.out.println(false);
}

神奇的事情發(fā)生了,num1和num2雖然都是128,但是他們并不相等。

這是因?yàn)镮nteger的值如果是-128~127之間的時(shí)候,Integer并不會(huì)創(chuàng)建新的對(duì)象,而是從IntegerCache.cache中取出的,所以他們隨便比較都沒有問題。

但是如果超出了這個(gè)范圍,就不一樣了。

不信你可以試試下面的代碼:

Integer num1 = 127;
Integer num2=  127;
if (num1 == num2) {
    System.out.println(true);
}
else{
    System.out.println(false);
}

=================================

可惜的是工作中常常忘記了這一點(diǎn),于是一場(chǎng)意外發(fā)生了。

本人前段時(shí)間寫的一段代碼中有下面一段:

String standardItemNameStr = sampleStandardItemList.stream()
  .filter(item -> item.getSampleId()==sample.getSampleId())
  .map(item -> item.getStandardItemName()).collect(Collectors.joining("、"));

系統(tǒng)剛剛上線的時(shí)候一切NICE,運(yùn)行很正常。突然有一天出事了。客戶跟反饋出BUG了。

本該顯示數(shù)據(jù)的地方,成了空值。

自己在本地測(cè)試,一切OK。代碼檢測(cè)了十遍以上,沒發(fā)現(xiàn)什么問題。

把生產(chǎn)環(huán)境的數(shù)據(jù)DOWN下來一跑發(fā)現(xiàn)其中第二行item.getSampleId()的值是180,這時(shí)突然想起Integer的這個(gè)設(shè)定。二話不說,修改為下面的代碼,一切恢復(fù)正常。

String standardItemNameStr = sampleStandardItemList.stream()
    .filter(item -> item.getSampleId() .equals(sample.getSampleId()))
    .map(item -> item.getStandardItemName()).collect(Collectors.joining("、"));

這個(gè)問題雖然很簡(jiǎn)單,但還是很容易忽略的。由此也擴(kuò)展思考了一下,去測(cè)試一下Double、Float包裝類,并沒有catch這類的設(shè)計(jì)思路。

原因嘛應(yīng)該也很簡(jiǎn)單,Integer是整數(shù),很多時(shí)候我們用Integer的時(shí)候需要用到的值確實(shí)是比較小的,所以官方做個(gè)catch確實(shí)能起到提高執(zhí)行效率的作用,而且這個(gè)緩存命中率還是比較高的,但是小數(shù)的主要用途是在小數(shù)方面,如果要做catch的話,那數(shù)量可就太多了。

那么byte、short、long的包裝類會(huì)不會(huì)也有catch的設(shè)計(jì)呢?

補(bǔ)充:Java Integer比較中的那些坑

前幾天同事偶然遇到的一個(gè)問題,在list中查詢出重復(fù)的值,留下第一個(gè),其余刪除。

ArrayList<Integer> a//a中裝有要操作的數(shù)據(jù),都是數(shù)字
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);
        }
    }
}

然后喜聞樂見的程序出問題了:程序無法將相同的值除第一個(gè)外刪除掉。說起來這也是一個(gè)比較基礎(chǔ)性的問題。

int為基本類型,Integer類型為基本包裝類型。因而可以將Integer當(dāng)做一個(gè)對(duì)象來理解,所以在上面的代碼示例中,用==來比較2個(gè)對(duì)象的引用無疑就是在搞笑了,地址都不一樣,怎么可能返回true。

但是這里存在著一些坑,就是Integer有時(shí)候用==比較是可以得到true的(值相同),原因如下:

在-128至127之間的賦值,Integer對(duì)象是在IntegerCache.cache產(chǎn)生,會(huì)復(fù)用已有對(duì)象,這個(gè)區(qū)間內(nèi)的Integer值可以直接使用==進(jìn)行判斷,但是這個(gè)區(qū)間之外的所有數(shù)據(jù),都會(huì)在堆上產(chǎn)生,并不會(huì)復(fù)用已有對(duì)象。

所以推薦都使用equals比較。

附上int類型自動(dòng)裝箱為Integer時(shí)的源代碼(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);
    }

這里還牽涉到了一點(diǎn),就是這里為什么不直接用int類型呢?這是因?yàn)锳rrayList中只接受Object對(duì)象,實(shí)際情況如下:

ArrayList al=new ArrayList();
int n=40;
Integer nI=new Integer(n);
al.add(n);//不可以
al.add(nI);//可以

以上就是關(guān)于“Java中Integer使用的問題怎么解決”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI