Java Integer封裝類的IntegerCache內部類

來源:互聯網
上載者:User

標籤:個數   範圍   建構函式   等於   log   span   引用   src   勿噴   

個人理解,不喜勿噴,歡迎指正。

首先看下面這段代碼,猜一下輸出結果是什麼

1         Integer a = 10;2         Integer b = 10;3         System.out.println(a == b);4         a = 100;5         b = 100;6         System.out.println(a == b);7         a = 1000;8         b = 1000;9         System.out.println(a == b);    

你以為是true true true 或者是false false false嗎?

天真,看

你沒看錯,就是這麼坑!

按理說,Integer是封裝類型,結果應該是false false false。

那麼我們看下這段代碼到底是怎樣執行的,會出現這種結果

首先賦值時,先調用了下面的函數,這裡出現了個奇怪的東西,IntegerCache,看起來問題就在這裡

接下來看一下IntegerCache到底是個什麼東東,下面是該類的源碼

在源碼中我們看到這個類有一個[-128,127]的Integer數組cache(這個數組的上限看起來好像是可以變的,但是我沒有rt的源碼包,所以不知道具體細節),所以在看Integer賦值的代碼,就很清晰了

 這裡判斷你賦值的數大小是否被包含在IntegerCache的cache數組內

如果在,就返回該對象的引用,因而小於等於127大於等於-128的數,通過==比較可以得出結果為true,因為引用相同,而超出範圍的數就調用Integer的建構函式重新建立一個Integer對象因而雖然值相同但是由於引用不同而得出結果為false

所以判斷對象的值是否相同時還是使用a.equals(b)

 

Java Integer封裝類的IntegerCache內部類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.