最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間: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 中表達式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 這種代碼是看哪個源碼,不要緊,我們可以看下其編譯后的 class 文件。

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

繼續(xù)看 IntegerCache :

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

private static class IntegerCache {
    // 緩存的下界值,固定為-128
    static final int low = -128;
    // 緩存的上界值,可以通過系統(tǒng)屬性進行配置
    static final int high;
    // 緩存數(shù)組,用于存儲從low到high范圍內(nèi)的Integer對象
    static final Integer cache[];
    static {
        // 默認情況下,緩存的上界是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ù),忽略該屬性并保持默認的上界值
            }
        }
        // 設(shè)置高界值
        high = h;
        // 初始化緩存數(shù)組,數(shù)組大小根據(jù)low和high計算得出
        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)造器,防止外部實例化這個內(nèi)部類
    private IntegerCache() {}
}

2、源碼解讀

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

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

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

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

3、解答問題

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

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

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

4、正確比較

其實對于 Integer 這種包裝類比較大小,我們應(yīng)該使用 equals() 方法來比較兩個 Integer 對象的數(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

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

如果你是一名Java開發(fā)人員,我還是比較推薦你去閱讀這個手冊,對我們?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)文章

  • Java卡片布局管理器解釋及實例

    Java卡片布局管理器解釋及實例

    這篇文章主要介紹了Java卡片布局管理器解釋及實例,需要的朋友可以參考下。
    2017-09-09
  • SpringBoot3集成和使用Jasypt的代碼詳解

    SpringBoot3集成和使用Jasypt的代碼詳解

    隨著信息安全的日益受到重視,加密敏感數(shù)據(jù)在應(yīng)用程序中變得越來越重要,Jasypt作為一個簡化Java應(yīng)用程序中數(shù)據(jù)加密的工具,為開發(fā)者提供了一種便捷而靈活的加密解決方案,本文將深入解析Jasypt的工作原理,需要的朋友可以參考下
    2024-01-01
  • Java集合Map常見問題_動力節(jié)點Java學(xué)院整理

    Java集合Map常見問題_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細整理了Java集合Map常見問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 最簡單的java生成word文檔方法

    最簡單的java生成word文檔方法

    這篇文章主要介紹了java生成word文檔最簡單的方法,首先說明,使用該方法時,盡量不要使用wps新建word文檔,經(jīng)測試,手機不能兼容,出現(xiàn)很多格式問題,office則手機可以很好的兼容,所以,本文以office做教程
    2021-08-08
  • Java實現(xiàn)規(guī)則幾何圖形的繪制與周長面積計算詳解

    Java實現(xiàn)規(guī)則幾何圖形的繪制與周長面積計算詳解

    隨著計算機的發(fā)展,人們對圖形的計算要求會越來越高。在各行各業(yè)中的計算人員會對圖形的計算要有便利的要求,規(guī)則幾何圖形問題求解程序應(yīng)運而生!本文將用Java編寫一個程序,可以實現(xiàn)規(guī)則幾何圖形的繪制與周長面積計算,感興趣的可以了解一下
    2022-07-07
  • Java訪問者設(shè)計模式詳細講解

    Java訪問者設(shè)計模式詳細講解

    大多數(shù)情況下你不需要訪問者模式,但當一旦需要訪問者模式時,那就是真的需要它了,這是設(shè)計模式創(chuàng)始人的原話??梢钥闯鰬?yīng)用場景比較少,但需要它的時候是不可或缺的,這篇文章就開始學(xué)習(xí)最后一個設(shè)計模式——訪問者模式
    2022-11-11
  • Java中的clone,sallow?copy和deep?copy的區(qū)別解析

    Java中的clone,sallow?copy和deep?copy的區(qū)別解析

    本文給大家介紹了Java中的clone,sallow?copy和deep?copy的區(qū)別解析,介紹了克隆的概念和作用,以及淺克隆和深克隆的區(qū)別,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • java檢查數(shù)組是否有重復(fù)元素的方法

    java檢查數(shù)組是否有重復(fù)元素的方法

    這篇文章主要介紹了java檢查數(shù)組是否有重復(fù)元素的方法,涉及java針對數(shù)組元素的操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 快速了解hibernate配置文件與映射文件

    快速了解hibernate配置文件與映射文件

    這篇文章主要介紹了快速了解hibernate配置文件與映射文件,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • mybatis mapper.xml 區(qū)間查詢條件詳解

    mybatis mapper.xml 區(qū)間查詢條件詳解

    這篇文章主要介紹了mybatis mapper.xml 區(qū)間查詢條件詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

疏勒县| 东乡族自治县| 贺州市| 永川市| 赤峰市| 高阳县| 哈巴河县| 孟村| 东平县| 泽普县| 高邮市| 石柱| 绩溪县| 尚义县| 远安县| 东宁县| 梨树县| 土默特右旗| 长丰县| 桃江县| 察雅县| 渭南市| 昭苏县| 眉山市| 洛扎县| 淮滨县| 张家界市| 陵川县| 蒙自县| 平远县| 确山县| 泰和县| 皋兰县| 萨迦县| 北碚区| 陈巴尔虎旗| 酉阳| 株洲市| 宁阳县| 贵南县| 常宁市|