日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

为什么Java中1000==1000为false,而100==100为true?

發布時間:2025/3/20 java 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么Java中1000==1000为false,而100==100为true? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方?好好學java?,選擇?星標?公眾號

重磅資訊、干貨,第一時間送達今日推薦:2020年7月程序員工資統計,平均14357元,又跌了,扎心個人原創100W+訪問量博客:點擊前往,查看更多

來源于公眾號:Java高效學習

這是一個挺有意思的討論話題。

如果你運行下面的代碼:

Integer?a?=?1000,?b?=?1000;?? System.out.println(a?==?b);//1 Integer?c?=?100,?d?=?100;?? System.out.println(c?==?d);//2

你會得到

false true

基本知識:我們知道,如果兩個引用指向同一個對象,用 == 表示它們是相等的。如果兩個引用指向不同的對象,用 == 表示它們是不相等的,即使它們的內容相同。

因此,后面一條語句也應該是 false 。

這就是它有趣的地方了。如果你看去看 Integer.java 類,你會發現有一個內部私有類,IntegerCache.java,它緩存了從 - 128 到 127 之間的所有的整數對象。

所以事情就成了,所有的小整數在內部緩存,然后當我們聲明類似——

Integer?c?=?100;

的時候,它實際上在內部做的是:

Integer?i?=?Integer.valueOf(100);

現在,如果我們去看 valueOf() 方法,我們可以看到

public?static?Integer?valueOf(int?i)?{if?(i?>=?IntegerCache.low?&&?ireturn?IntegerCache.cache\[i?+?(-IntegerCache.low)\];return?new?Integer(i);}

如果值的范圍在 - 128 到 127 之間,它就從高速緩存返回實例。

所以…

Integer?c?=?100,?d?=?100;

指向了同一個對象。

這就是為什么我們寫

System.out.println(c?==?d);

我們可以得到 true。

現在你可能會問,為什么這里需要緩存?

合乎邏輯的理由是,在此范圍內的 “小” 整數使用率比大整數要高,因此,使用相同的底層對象是有價值的,可以減少潛在的內存占用。

然而,通過反射 API 你會誤用此功能。

運行下面的代碼,享受它的魅力吧

public?static?void?main(String\[\]?args)?throws?NoSuchFieldException,?IllegalAccessException?{Class?cache?=?Integer.class.getDeclaredClasses()\[0\];?//1Field?myCache?=?cache.getDeclaredField("cache");?//2myCache.setAccessible(true);//3Integer\[\]?newCache?=?(Integer\[\])?myCache.get(cache);?//4newCache\[132\]?=?newCache\[133\];?//5int?a?=?2;int?b?=?a?+?a;System.out.printf("%d?+?%d?=?%d",?a,?a,?b);?//} 最后,再附上我歷時三個月總結的?Java 面試 + Java 后端技術學習指南,筆者這幾年及春招的總結,github 1.5k star,拿去不謝! 下載方式1.?首先掃描下方二維碼2.?后臺回復「Java面試」即可獲取

總結

以上是生活随笔為你收集整理的为什么Java中1000==1000为false,而100==100为true?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。