第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

弱引用可維護(hù)性

弱引用可維護(hù)性

不負(fù)相思意 2021-07-27 21:18:51
我正在閱讀 java 中的弱引用,聽起來很簡單,如果一個對象只有弱引用,那么它可以被垃圾收集器收集。除了如果您的引用在使用該值之前失效會發(fā)生什么?例子:假設(shè)我有一個鍵為 {1,2,3,4,5} 的弱哈希映射,所有值都為 1?,F(xiàn)在假設(shè)您有一個用于 [1:10] 中數(shù)字的隨機數(shù)生成器?,F(xiàn)在每次得到這個數(shù)字時,它都會檢查它是否是映射中的一個鍵,然后給出一個對該鍵的臨時強引用。因此,通過此設(shè)置,您將擁有一些具有強引用的鍵,因此會留在內(nèi)存中,但您也有可能在選擇之前某些鍵已失效。如果我對弱哈希映射的直覺是正確的,那是否意味著映射將在某個時候從其原始狀態(tài)改變?
查看完整描述

3 回答

?
慕神8447489

TA貢獻(xiàn)1780條經(jīng)驗 獲得超1個贊

嘗試使用Integer對象作為 a 的鍵WeakHashMap可能會導(dǎo)致一些奇怪的行為。首先,javadoc forWeakHashMap有以下注釋:

此類主要用于其等于方法使用 == 運算符測試對象身份的關(guān)鍵對象。一旦這樣的鍵被丟棄,它就永遠(yuǎn)不會被重新創(chuàng)建,所以以后不可能在 WeakHashMap 中查找該鍵,并且會驚訝于它的條目已被刪除。此類將與關(guān)鍵對象完美配合,這些對象的 equals 方法不基于對象標(biāo)識,例如 String 實例。然而,對于這種可重新創(chuàng)建的鍵對象,自動刪除鍵已被丟棄的 WeakHashMap 條目可能會令人困惑。

考慮以下代碼:

   WeakHashMap<Integer, String> map = new WeakHashMap<>();

    Integer k = Integer.valueOf(9001);

    map.put(k, "OVER 9000!?");


    while (true)

    {

        System.out.println(map.get(k));

        Thread.sleep(100);

        k = Integer.valueOf(9001);

        System.gc();

    }

循環(huán)將從打印“OVER 9000!?”開始,但在第一個循環(huán)之后,原始鍵已被丟棄(即使現(xiàn)在有一個equals對它的鍵的引用)。結(jié)果,如果該鍵對象被垃圾收集,則條目將從地圖中刪除,并且循環(huán)將開始打印“null”。由于我們System.gc();在丟棄密鑰后調(diào)用,因此這很可能發(fā)生在單個循環(huán)之后。


但這并不是Integer作為WeakHashMap密鑰使用的問題的結(jié)束。如果將上面的值 9001 更改為 1,您會發(fā)現(xiàn)行為發(fā)生了變化?。赡??這可能取決于實現(xiàn)。)現(xiàn)在,條目永遠(yuǎn)不會從地圖中刪除。這是因為整數(shù)緩存——Integer.valueOf(1)總是返回相同的Integer實例,但每次都會Integer.valueOf(9001)創(chuàng)建一個新Integer實例。


第二個問題特定于Integer,但第一個問題實際上適用于您嘗試在equals不基于 的情況下使用密鑰的任何方案==。如果equals 是基于==,那么你的問題并沒有真正適用-如果你沒有很強的參考鑰匙了,也不要緊,是否值被從地圖上刪除,因為你不再有辦法得到它——你不能重新創(chuàng)建一個使用基于身份的平等的密鑰。



查看完整回答
反對 回復(fù) 2021-07-29
  • 3 回答
  • 0 關(guān)注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號