什么是什么WeakHashMap时候应该使用它?a WeakHashMap和a 之间有什么区别HashMap?
首先,我想澄清我对 的理解,WeakReference因为以下问题取决于相同。
static void test() {
Person p = new Person();
WeakReference<Person> person = new WeakReference<>(p);
p = null;
System.gc();
System.out.println(person.get());
System.out.println(person);
}
static class Person {
String name;
}
static class PersonMetadata {
String someData;
public PersonMetadata(String met) {
someData = met;
}
}
Run Code Online (Sandbox Code Playgroud)
上面代码的输出是
null
java.lang.ref.WeakReference@7852e922
这意味着虽然有一个实际的 person 对象在 GC 运行时被垃圾收集,但是WeakReference<Person>内存中存在一个类的对象,此时它不指向任何东西。
现在考虑到上述理解是正确的,我对它的WeakHashMap<K,V>工作原理感到困惑。在下面的代码中
public static void main(String[] args) {
Person p = new Person();
p.name = "John";
WeakHashMap<Person, PersonMetadata> map = new WeakHashMap<>(); …Run Code Online (Sandbox Code Playgroud) java collections garbage-collection weak-references weakhashmap
在下面的代码nameRef.get()是null,之后name = null和System.gc().
import java.lang.ref.WeakReference;
public class Main {
public static void main(String[] args) {
String name = new String("ltt");
WeakReference<String> nameRef = new WeakReference<>(name);
System.out.println(nameRef.get()); // ltt
name = null;
System.gc();
System.out.println(nameRef.get()); // null
}
}
Run Code Online (Sandbox Code Playgroud)
WeakHashMap基于WeakReference.最后,我认为map.size()将是0.事实上,它是1.
import java.util.WeakHashMap;
public class Main2 {
public static void main(String[] args) {
String name = new String("ltt");
WeakHashMap<String, Integer> map = new WeakHashMap<>();
map.put(name, 18);
System.out.println(map.size()); // 1
name = null;
System.gc();
System.out.println(map.size()); // …Run Code Online (Sandbox Code Playgroud)