鵬:
私はJava7ののWeakHashMapを使用しようとしていると私はそののisEmpty()メソッドは私に間違った結果が得られました。
import java.util.Map;
import java.util.WeakHashMap;
public class Test
{
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();
System.out.println(map.isEmpty());
System.out.println(map.keySet().isEmpty());
System.out.println(map);
}
}
実際の結果:
偽
真
{}
それは言うことです、
map.isEmpty()とmap.keySet()。のisEmpty()は一貫していません。誰かの助けが私はそれを理解することはできますか?どうもありがとう。
ないJD:
...この結果はスナップショットで、彼らはもはや参照されているので、次回のアクセス試行の前に削除されません未処理のエントリを反映しないかもしれません。
それは期待そんなにisEmpty()
GC後に正しい値を返しますし、アクセス後。このコードは、このことを示しています。
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