我原本期望WeakReference类像这样覆盖hashCode和equals方法
class WeakReference<T>{
T ref;
int hashCode(){
return ref.hashCode();
}
boolean equals(Object o){
return ref.equals(o);
}
}
这样我就可以直接将We WeakReference用作哈希映射中的键,例如:
Person p1 = new Person("p1");
WeakReference<Person> wr = new WeakReference<Person>(p1);
map.put(wr, "some value object");
但是当我进行测试时,我发现hashCode和equals方法没有被覆盖重写。
Person p1 = new Person("p1");
WeakReference<Person> wr = new WeakReference<Person>(p1);
WeakReference<Person> wr2 = new WeakReference<Person>(p1);
System.out.println(wr.hashCode()); // prints x
System.out.println(wr2.hashCode()); // prints y
System.out.println(wr.equals(wr2)); // prints false
为什么WeakReference类中没有重写hashCode和equals方法呢?是否有特定原因?
WeakHashMap
可以满足你的需求。 - AndreasWeakReference
重写了equals
和hashCode
,那么将它们用作HashMap
键将是一个非常糟糕的想法。这是因为当所持有的对象被取走时,WeakReference
的hashCode
几乎肯定会改变。您永远不应该导致HashMap
键在放入后发生更改,因为这样就无法再找到它了。 - Paul Boddington