相关疑难解决方法(0)

什么是WeakHashMap以及何时使用它?

什么是什么WeakHashMap时候应该使用它?a WeakHashMap和a 之间有什么区别HashMap

java collections weakhashmap

144
推荐指数
5
解决办法
9万
查看次数

当实际对象被垃圾回收时,WeakHashMap 中条目中的值如何被垃圾回收?

首先,我想澄清我对 的理解,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

6
推荐指数
1
解决办法
437
查看次数

Java WeakHashMap何时清除null键?

在下面的代码nameRef.get()是null,之后name = nullSystem.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)

java garbage-collection weak-references weakhashmap

2
推荐指数
2
解决办法
208
查看次数