0
在下面的代码中,我创建了一个Pen对象并将它的颜色初始化为白色。在Pen的构造函数中,将字段'penColor'设置为传递给构造函数的值之后,我更新了一个全局静态弱散列表,我保留KEY的位置'this pointer - 在我的情况下是Pen,值是另一个weakhashmap,其KEY是字符串“penColor”,其值是对penColor成员字段的引用。Java WeakHashMap参考没有更新
接下来,我的代码通过调用Pen的setColor函数来更新Pen的颜色。我会认为在更新之后,如果我在我的弱散焦图中查找Pen对象的颜色字段,它会反映新的颜色,但它不会。有人可以解释为什么吗?
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;
}
}
约翰嗨, 感谢您的及时回复。我想我明白你在说什么,但仍然很难消化。笔的颜色与笔的颜色有何不同。他们不是两个引用?注意我将笔保存在地图中,作为KEY。 – 2009-09-18 17:57:26
您将笔保留为关键字,但您将*初始颜色*用作值。它只是一个对象的引用 - 它不是对表达式“this.penColor”或类似的东西的引用。 – 2009-09-18 18:02:32
我应该接受你的理解吗?如果没有,请添加更多评论,我们可以根据您的喜好进行更改。我认为值得从等式中去掉嵌套地图 - 它们并不真正相关,但它们可能会让你更难想象。 – 2009-09-18 18:03:36