欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解釋為什么Java中“1000==1000”為false而”100==100“為true

 更新時(shí)間:2024年01月09日 09:50:40   作者:YSOcean  
在日常編程中,我們經(jīng)常遇到一些看似簡單卻隱藏著復(fù)雜邏輯的問題,這篇文章主要介紹了解釋為什么Java中“1000==1000”為false而”100==100“為true,需要的朋友可以參考下

在日常編程中,我們經(jīng)常遇到一些看似簡單卻隱藏著復(fù)雜邏輯的問題。

推薦閱讀:

推薦Java微信公眾號干貨【Java技術(shù)迷】

【第19期】面試官:為什么 Java 中“1000==1000”為false,而”100==100“為true?

淺談為什么Java中1000==1000為false而100==100為true

比如,你是否想過為什么在 Java 中表達(dá)式1000==1000會返回 false,而 100==100 卻返回 true 呢?

Integer a = 100;
Integer b = 100;
System.out.println(a == b); // 輸出:true
Integer c = 1000;
Integer d = 1000;
System.out.println(c == d); // 輸出:false

1、源碼追溯

解決問題,一定要深入本質(zhì),而解決編程問題,深入本質(zhì)的方法就是對源碼一探究竟。

可能大家不知道 Integer a = 100 這種代碼是看哪個(gè)源碼,不要緊,我們可以看下其編譯后的 class 文件。

很明顯,我們得看 Integer 類的 valueOf 方法:

繼續(xù)看 IntegerCache :

為了防止大家不好理解,我這里為這個(gè)方法添加了詳細(xì)注釋:

private static class IntegerCache {
    // 緩存的下界值,固定為-128
    static final int low = -128;
    // 緩存的上界值,可以通過系統(tǒng)屬性進(jìn)行配置
    static final int high;
    // 緩存數(shù)組,用于存儲從low到high范圍內(nèi)的Integer對象
    static final Integer cache[];
    static {
        // 默認(rèn)情況下,緩存的上界是127
        int h = 127;
        // 嘗試從系統(tǒng)屬性java.lang.Integer.IntegerCache.high中獲取自定義的上界值
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                // 將字符串轉(zhuǎn)換為整數(shù)
                int i = parseInt(integerCacheHighPropValue);
                // 確保自定義的上界至少為127,以包含Java規(guī)范要求的緩存范圍
                i = Math.max(i, 127);
                // 確保上界不超過Integer.MAX_VALUE - (-low) - 1,以防止數(shù)組大小超出Integer的最大值
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // 如果字符串無法解析為整數(shù),忽略該屬性并保持默認(rèn)的上界值
            }
        }
        // 設(shè)置高界值
        high = h;
        // 初始化緩存數(shù)組,數(shù)組大小根據(jù)low和high計(jì)算得出
        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++) {
            // 創(chuàng)建Integer對象并填充數(shù)組
            cache[k] = new Integer(j++);
        }
        // 斷言確保緩存的上界至少為127,符合Java語言規(guī)范
        assert IntegerCache.high >= 127;
    }
    // 私有構(gòu)造器,防止外部實(shí)例化這個(gè)內(nèi)部類
    private IntegerCache() {}
}

2、源碼解讀

其實(shí)這部分源碼不難理解,首先對于 valueOf 方法,當(dāng)傳入的整型值在 -128-127 之間時(shí),返回的是 IntegerCache 里面的值。

這個(gè) IntegerCache 是在 Java 的 Integer 類中的一個(gè)內(nèi)部靜態(tài)類 ,它緩存了 -128 到 127 之間的整數(shù)。

當(dāng)我們聲明一個(gè) Integer 對象并賦予一個(gè)在這個(gè)范圍內(nèi)的值時(shí),Java 實(shí)際上會返回一個(gè)預(yù)先創(chuàng)建好的對象引用。

這種機(jī)制可以有效減少內(nèi)存的使用,并提高性能。

3、解答問題

看懂了源碼,在回到上面的問題,為什么表達(dá)式1000==1000會返回 false,而 100==100 卻返回 true 呢?

當(dāng)我們使用 Integer 對象比較兩個(gè)數(shù)時(shí),實(shí)際上是在比較對象的內(nèi)存地址。由于“100”在緩存范圍內(nèi),兩個(gè)“100”實(shí)際上引用的是同一個(gè)對象,所以返回 true。

相反,“1000”不在緩存范圍內(nèi),即使數(shù)值相同,兩個(gè)“1000”也是不同的對象,因此內(nèi)存地址不同,返回 false。

4、正確比較

其實(shí)對于 Integer 這種包裝類比較大小,我們應(yīng)該使用 equals() 方法來比較兩個(gè) Integer 對象的數(shù)值,而不是直接使用 == 操作符,除非我們確實(shí)想比較對象的引用。

Integer a = 100;
Integer b = 100;
System.out.println(a.equals(b)); // 輸出:true
Integer c = 1000;
Integer d = 1000;
System.out.println(c.equals(d)); // 輸出:true

這點(diǎn)在阿里開發(fā)手冊中也有詳細(xì)說明:

如果你是一名Java開發(fā)人員,我還是比較推薦你去閱讀這個(gè)手冊,對我們?nèi)粘>幋a規(guī)范還是挺有幫助的。下面小編整理到網(wǎng)盤,喜歡的拿去用吧。

百度網(wǎng)盤下載鏈接

鏈接: https://pan.baidu.com/s/1gRmW6KIp1Re4Liwjf1y3_g

提取碼: sb7t

到此這篇關(guān)于解釋為什么Java中“1000==1000”為false而”100==100“為true的文章就介紹到這了,更多相關(guān)Java中“1000==1000”為false而”100==100“為true內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis中通用Mapper的InsertList()用法

    Mybatis中通用Mapper的InsertList()用法

    文章介紹了通用Mapper中的insertList()方法在批量新增時(shí)的使用方式,包括自增ID和自定義ID的情況,對于自增ID,使用tk.mybatis.mapper.additional.insert.InsertListMapper包下的insertList()方法;對于自定義ID,需要重寫insertList()方法
    2025-02-02
  • JAVA多線程Thread和Runnable的實(shí)現(xiàn)

    JAVA多線程Thread和Runnable的實(shí)現(xiàn)

    java中實(shí)現(xiàn)多線程有兩種方法:一種是繼承Thread類,另一種是實(shí)現(xiàn)Runnable接口。
    2013-03-03
  • mybatis返回的map結(jié)果如何設(shè)置有序

    mybatis返回的map結(jié)果如何設(shè)置有序

    這篇文章主要介紹了mybatis返回的map結(jié)果如何設(shè)置有序,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 寶塔面板配置及部署javaweb教程(全網(wǎng)最全)

    寶塔面板配置及部署javaweb教程(全網(wǎng)最全)

    這篇文章主要介紹了寶塔面板配置及部署javaweb教程(全網(wǎng)最全),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • java之StringBuffer常見使用方法解析

    java之StringBuffer常見使用方法解析

    這篇文章主要介紹了java之StringBuffer常見使用方法解析,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • IDEA中的Structure模塊使用圖文詳解

    IDEA中的Structure模塊使用圖文詳解

    IDEA 的 Structure 功能,也是在看代碼中一個(gè)十分常用的功能,最通用的方法,就是點(diǎn)擊 IDEA 左下角的 Structure 標(biāo)簽頁即可,本文重點(diǎn)介紹IDEA中的Structure模塊使用詳解,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Java中方法使用的深入講解

    Java中方法使用的深入講解

    這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java利用apache ftp工具實(shí)現(xiàn)文件上傳下載和刪除功能

    Java利用apache ftp工具實(shí)現(xiàn)文件上傳下載和刪除功能

    這篇文章主要為大家詳細(xì)介紹了Java利用apache ftp工具實(shí)現(xiàn)文件上傳下載、刪除功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Java線程創(chuàng)建(賣票),線程同步(賣包子)的實(shí)現(xiàn)示例

    Java線程創(chuàng)建(賣票),線程同步(賣包子)的實(shí)現(xiàn)示例

    這篇文章主要介紹了Java線程創(chuàng)建(賣票),線程同步(賣包子)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 淺談SpringBoot處理url中的參數(shù)的注解

    淺談SpringBoot處理url中的參數(shù)的注解

    下面小編就為大家分享一篇淺談SpringBoot處理url中的參數(shù)的注解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01

最新評論