2 回答

TA貢獻1836條經驗 獲得超4個贊
你應該閱讀 WeakHashMap
的 javadoc:
該類的行為部分取決于垃圾回收器的操作,因此幾個熟悉的(盡管不是必需的)不變量不適用于此類。由于垃圾回收器可能隨時丟棄密鑰,因此 a 的行為可能就像未知線程正在靜默刪除條目一樣。特別是,即使您在實例上進行同步并且不調用其賦值函數方法,
size
方法也可能隨著時間的推移返回較小的值,isEmpty
方法返回false
然后返回 true
,對于返回該方法,稍后對于給定鍵,對于該方法返回給定鍵的值,但稍后返回 , 用于返回的方法和返回以前似乎在映射中的鍵的方法,以及連續檢查鍵集、值集合和條目集以生成連續較少數量的元素。WeakHashMap
Map
WeakHashMap
WeakHashMap
containsKey
true
false
get
null
put
null
remove
false
簡而言之,你所看到的效果是完全有效的。

TA貢獻1796條經驗 獲得超4個贊
WeakHashMap::isEmpty 說:
...此結果是快照,可能不會反映未處理的條目,這些條目將在下次嘗試訪問之前刪除,因為它們不再被引用。
因此,您會期望 在 GC 之后和訪問之后返回正確的值。此代碼演示了以下內容:isEmpty()
public class Scratch1 {
public static void main(final String[] args) {
final Map<String, Boolean> map = new WeakHashMap<>();
String b = new String("B");
map.put(b, true);
b = null;
System.gc();
// map not internally accessed at this point
System.out.println(map.isEmpty());
// let's access the Map's internals (and hopefully coerce
// it into removing no-longer-referenced keys)
System.out.println(map.keySet()
.isEmpty());
// map HAS now been accessed
System.out.println(map.isEmpty());
}
}
收益 率:
false
true
true
添加回答
舉報