Java WeakHashMap 引用未更新

标签 java weak-references weakhashmap

在下面的代码中,我创建了一个 Pen 对象并将其颜色初始化为白色。在 Pen 的构造函数中,将字段“penColor”设置为传递给构造函数的值后,我更新了一个全局静态弱 HashMap ,其中 KEY 是“this 指针 - 在我的例子中是 Pen,并且value 是另一个weakhashmap,其 KEY 是字符串“penColor”,其值是对 penColor 成员字段的引用。

接下来,我的代码通过调用 Pen 的 setColor 函数来更新 Pen 的颜色。我本以为在这次更新之后,如果我在weakhashmap中查找Pen对象的颜色字段,它会反射(reflect)新的颜色,但事实并非如此。有人可以解释这是为什么吗?

package weakhashmaptest;


import java.awt.Color;
import java.util.WeakHashMap;
import java.util.Iterator;

public class Main {

    static WeakHashMap <Object, WeakHashMap>ownerMap = new WeakHashMap<Object, WeakHashMap>();

    public static void main(String[] args) {

        Pen r = new Pen(Color.WHITE);

        Iterator i = ownerMap.keySet().iterator();

        while(i.hasNext()) {
            Object key = i.next();
            System.out.println("\telement of hashmap is : " +ownerMap.get(key));
        }

        r.setColor(Color.BLACK);

        System.gc();

        i = ownerMap.keySet().iterator();

        while(i.hasNext()) {
            Object key = i.next();
            System.out.println("\telement of hashmap is : " +ownerMap.get(key));
        }

    }

    public static void mapUpdate(Object owner, Object reference, String field_name) {

        WeakHashMap reference_map = ownerMap.get(owner);

        if (reference_map == null) {         
            reference_map = new WeakHashMap();
            reference_map.put(field_name, reference);
        } else {         
            reference_map.put(field_name, reference);
        }

        ownerMap.put(owner, reference_map);

    }

}

class Pen {

    Color penColor;

    public Pen(Color c) {

        penColor = c;
        Main.mapUpdate(this, penColor, "penColor");

    }

    public void setColor(Color c) {

        penColor = c;

    }

}

最佳答案

您将对 Color 对象的引用放入 map 中,而不是 Pen。如果您将放入 map 中,然后稍后询问笔的颜色,您就会看到变化。

用非常简单的术语来说,您正在做的事情类似于:

Pen pen = new Pen(Color.WHITE);
Color color = pen.penColor;
pen.setColor(Color.BLACK);
// color here still refers to Color.WHITE, not Color.BLACK.

关于Java WeakHashMap 引用未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1445929/

相关文章:

java - 理解回溯(网格上的机器人)

java - 为什么 JavaFX TextField 监听器不起作用?

java - WeakReferenced 对象在调用 System.gc() 后未被垃圾回收

java - 有人可以向我解释一下什么时候使用 MapMaker 或 WeakHashMaps 有用吗?

java - 让 android 通知打开新 Activity

ios - block 内的强弱。我该如何处理这个问题?

ios - 将非 nil 对象设置为弱属性第二次返回 nil 但不是第一次

java - WeakHashMap 的 keySet 条目永远不会为空吗?

java - WeakHashMap 和强引用值

java - 基于工作 php 代码在 Java 中使用正则表达式