問號臉為什麼 Java 中1000==1000 為 false而 100==100 為 true

2020-12-24 酷扯兒

本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫

為什麼 Java 中「1000==1000」為false,而」100==100「為true?這是一個挺有意思的討論話題。

如果你運行下面的代碼:

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

你會得到

falsetrue

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

因此,後面一條語句也應該是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 && i return 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]; //1 Field myCache = cache.getDeclaredField("cache"); //2 myCache.setAccessible(true);//3 Integer[] newCache = (Integer[]) myCache.get(cache); //4 newCache[132] = newCache[133]; //5 int a = 2; int b = a + a; System.out.printf("%d + %d = %d", a, a, b); // }

相關焦點

  • 別把100泰銖誤用為1000泰銖
    由於新發行的100銖紀念鈔的顏色和1000銖紀念鈔相似,商人和紙幣使用者們均表示很擔憂,可能會因此產生混淆。臉書用戶The Spark Trader發布了一篇關於新版100泰銖紀念鈔的文章,新版100銖和1000銖非常相似,早上和男朋友談論像1000泰銖時,他剛好購買了50銖的東西,商販卻找零950銖,他提醒商販要小心,這是100銖,和1000銖非常相似(這種紀念鈔於2020年12月12日開始使用),要謹慎使用,收付款時仔細檢查。
  • 100塊跟1000塊的T恤,有什麼區別?
    劃重點:材質、舒適度(以及為什麼不給標點?)我們可以看到,大家選擇1000塊T恤是因為覺得它會穿得久、舒適,並且有其他品牌代替不了的設計感。
  • 牛津大學- 雅思判斷題 True False Not Given Question
    In this lesson, you're going to learn how to complete true/false/not given, and yes/no/not given questions in the IELTS reading exam.歡迎來到牛津大學在線英語課堂。在本節課程中,你將學習如何完成雅思考試中的判斷正誤題目。
  • 自己被騙1000元,不被立案那麼給對方轉100萬元,是不更容易追回
    他們往往就騙1000元之內的數額,因為他們知道1000元以內公安局是不給立案的,如果他自己找不到,誰也不會來幫助他追回這些錢的。而且我國的詐騙罪案立案最低標準也在3000元,所以如果你被騙錢了,如果金額在3000元以內,那你豈不是虧大了,誰也不會幫助你。因此如果你被騙的金額數值越大,就更會有追回來的希望。所以你如果被騙了3000元以內,你怎麼也得想辦法把它提高到公安局立案的數額。
  • 100元買到1000元種草指南
    但要求是:」100元要買到1000元幸福感爆棚的生活」是的,只有100塊。由於小編對於金錢的敏感度為0特別請了財務出身的小姐姐幫我控制預算(沒想到請到一頭野馬,拉不住的那種。)▼▲ 這次去發現宜家很多商品都在大減價小編把清單分成家居、手帳及美妝3個組合不超過100元的小物清單!
  • java集合詳解合集
    也就是說,我們在加入一個新元素的時候,如果這個新元素對象和Set中已有對象進行注意equals比較都返回false,  則Set就會接受這個新元素對象,否則拒絕。Map的key不允許重複,即同一個Map對象的任何兩個key通過equals方法比較結果總是返回false。
  • 海賊王1000話「致敬」100話,史上最大彩頁來襲,劇情讓人期待
    999話和1000話組成史上最大彩頁如今海賊王即將迎來一個重大時刻,那就是1000話內容即將來襲!根據目前已知的官方信息公布,接下來《海賊王》999話內容將於12月21日正式發售。這裡一些「海迷」或許會問了,那1000話豈不是年內就能發布了?
  • JVC品牌日,攝像機滿1000減100!
    傑偉世(JVC) GZ-E369 攝像機250萬有效像素200倍數碼變焦1080P高清 低照度拍攝購買指定型號攝像機享受滿1000直降100的勁爆優惠!傑偉世JVC GC-PX100BAC,自帶WIFI功能數碼攝像機 下單曬單均有贈品,內置32G快閃記憶體,WIFI功能,F1.2明亮鏡頭&29.5mm的廣角
  • 美文_00136_《True and False Simplicity》
    純樸是無私的靈魂中一種正直的品質;它不同於真誠,並高於真誠。  另一種人是,不管為同類還是為上帝效力,均全然忘我地投入-自以為聰明含蓄,心中充滿自我,只要自滿的情緒受到絲毫幹擾便心煩意亂,是另一種極端。
  • 手把手帶你用Java打造一款對對碰遊戲(下篇)
    swapAnimal(i,j);//實現交換圖片                  }             }         }     } } (四)添加計時器1.在DuiDuiPeng構造函數裡添加計時器;代碼如下所示:timer=new Timer(1000
  • 20個非常有用的Java程序片段(上)
    integer to numeric string  int i = Integer.parseInt(a); //numeric string to an int2.向文件末尾添加內容BufferedWriter out = null;  try {      out = new BufferedWriter(new FileWriter(」filename」, true
  • 手把手教你用Java打造一款簡單故事書(下篇)
    3.java讀取txt文件,簡化代碼。三、項目實施首先回顧上一節的手把手教你用Java打造一款簡單故事書(上篇),完成界面的窗口、菜單欄、上下頁的按鈕,效果如下圖所示。接下來,小編帶大家完成剩下的功能,具體的實現步驟如下。
  • 1000萬!中地君豪為中山大學附屬第一醫院捐資助力學科建設
    此次捐資金額為人民幣1000萬元,所捐資金將用於中山一院的學科建設、人才培養、醫療設備採購等多個方面,助力中山一院繼續加強學科建設,在醫學領域開展深入研究,向「具有中國特色、世界一流水平的國家醫學中心」的目標更進一步!
  • 海賊王漫畫1000話情報最新在線看 「致敬」100話,史上最大彩頁來襲
    如今海賊王即將迎來一個重大時刻,那就是1000話內容即將來襲!根據目前已知的官方信息公布,接下來《海賊王》999話內容將於12月21日正式發售。與此同時還公布了一個消息,那就是《海賊王》999話和1000話的卷頭彩頁將拼成海賊王歷史上最大的「彩頁」。為什麼這樣做呢?這算是一種「致敬」,如上圖所示,這是當初100話的連載彩頁。
  • 鈴木誕生100周年之際 GSX-R1000R紀念版閃亮登場
    2020年恰逢鈴木公司成立100周年,加入賽車比賽的60周年。在這一年,鈴木在獲得了MotoGP冠軍的同時,並獲得了耐力世界冠軍頭銜。2021 鈴木將推出GSX-R1000R周年紀念版來慶祝這些成就。車輛保持了與2020款相同的配置,其強大的999cc直列四缸水冷發動機,高級Showa懸架和Brembo制動硬體讓車輛保持在最佳狀態,全套的電子設備也為騎士提供了最佳的騎行表現。GSX-R1000R上一次徹底升級是在2017年,車輛在當時獲得了更大的馬力、可變氣門正時、從MotoGP衍生的電傳操縱、類似於F1的可變氣門升程技術,改進的進氣和排氣系統以及更高效的冷卻性能。
  • 認領一塊地1000元,這個村掙了100萬元
    這些稻穀將被加工成大米,運往浙江寧波,不僅能給寧波的市民餐桌帶來優質的有機大米,也為當地的貧困戶帶來豐厚的收益。 央視財經《天下財經》欄目視頻 結對幫扶延邊和龍市的寧波市鄞州區了解到這些情況後,從前年開始推出了「共享稻田」扶貧協作模式,將和龍市的稻田劃分成每塊面積100平方米的稻田,然後通過網絡報名的方式,面向寧波市鄞州區市民開放認領,每塊「共享稻田」認領價格為1000元。2018和2019兩年,鄞州區認領的「共享稻田」實現銷售額1395.2萬元,淨利潤381.4萬元。
  • 大叔路邊賣貓咪,異瞳的貓咪賣100塊,網友:1000塊我也買
    剛看到這隻貓咪的時候,它真的好慘啊,不僅被裝進了袋子裡,還被小狗壓著,貓咪真的是一臉生無可戀了。養到這麼大的一隻異瞳白貓,大叔賣的價格是100塊錢一隻,圍觀的個個都在討論它的眼睛,這一雙眼睛實在太漂亮了。有網友看到這隻貓咪之後,表示不要說100塊一隻,就算是賣1000塊一隻,自己也買。你覺得這隻貓咪賣100塊,貴嗎?
  • 「原創」Java並發編程系列36|FutureTask
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫線程池源碼中出現了很多Callable、Future、FutureTask等以前沒介紹過的接口,尤其是線程池提交任務時總是把任務封裝成FutureTask,今天就來為大家解惑: