为什么Java中1000==1000为false,而100==100为true?
生活随笔
收集整理的這篇文章主要介紹了
为什么Java中1000==1000为false,而100==100为true?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
點擊上方?好好學java?,選擇?星標?公眾號
來源于公眾號: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?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kotlin 越来越牛逼了!学Java都
- 下一篇: 挑战10个最难回答的Java面试题,我第