解釋為什么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集合Map常見問題_動力節(jié)點Java學(xué)院整理
這篇文章主要為大家詳細整理了Java集合Map常見問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
Java實現(xiàn)規(guī)則幾何圖形的繪制與周長面積計算詳解
隨著計算機的發(fā)展,人們對圖形的計算要求會越來越高。在各行各業(yè)中的計算人員會對圖形的計算要有便利的要求,規(guī)則幾何圖形問題求解程序應(yīng)運而生!本文將用Java編寫一個程序,可以實現(xiàn)規(guī)則幾何圖形的繪制與周長面積計算,感興趣的可以了解一下2022-07-07
Java中的clone,sallow?copy和deep?copy的區(qū)別解析
本文給大家介紹了Java中的clone,sallow?copy和deep?copy的區(qū)別解析,介紹了克隆的概念和作用,以及淺克隆和深克隆的區(qū)別,感興趣的朋友跟隨小編一起看看吧2026-02-02
mybatis mapper.xml 區(qū)間查詢條件詳解
這篇文章主要介紹了mybatis mapper.xml 區(qū)間查詢條件詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09

