解釋為什么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()用法
文章介紹了通用Mapper中的insertList()方法在批量新增時(shí)的使用方式,包括自增ID和自定義ID的情況,對于自增ID,使用tk.mybatis.mapper.additional.insert.InsertListMapper包下的insertList()方法;對于自定義ID,需要重寫insertList()方法2025-02-02JAVA多線程Thread和Runnable的實(shí)現(xiàn)
java中實(shí)現(xiàn)多線程有兩種方法:一種是繼承Thread類,另一種是實(shí)現(xiàn)Runnable接口。2013-03-03mybatis返回的map結(jié)果如何設(shè)置有序
這篇文章主要介紹了mybatis返回的map結(jié)果如何設(shè)置有序,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01寶塔面板配置及部署javaweb教程(全網(wǎng)最全)
這篇文章主要介紹了寶塔面板配置及部署javaweb教程(全網(wǎng)最全),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Java利用apache ftp工具實(shí)現(xiàn)文件上傳下載和刪除功能
這篇文章主要為大家詳細(xì)介紹了Java利用apache ftp工具實(shí)現(xiàn)文件上傳下載、刪除功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Java線程創(chuàng)建(賣票),線程同步(賣包子)的實(shí)現(xiàn)示例
這篇文章主要介紹了Java線程創(chuàng)建(賣票),線程同步(賣包子)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05