我原以为 WeakReference 类会像这样覆盖 hashCode 和 equals 方法
class WeakReference<T>{
T ref;
int hashCode(){
return ref.hashCode();
}
boolean equals(Object o){
return ref.equals(o);
}
}
这样我就可以直接使用 We WeakReference 作为 HashMap 中的键,例如
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 的任何具体原因?
最佳答案
Map(或 Set 的元素)上的任何键的一个重要方面是,一旦将其添加到集合中,它就必须是不可变的(或至少不能更改)。更改 key 具有未定义的行为,这种行为极不可能起作用。
WeakReference 可能会由于 GC 的执行而随时更改,即以您无法控制的方式更改,这使得 equals/hashCode 不适用于使用它们的一般集合。
I was trying to make MyWeakConcurrentHashMap
一个简单的方法是使用一个 WeakHashMaps 数组。例如32个分区。使用 hashCode() 来确定使用哪个 WeakHashMap。这样你就可以让一个线程同时访问每个单独的 WeakHashMap(最好的情况)
随着并发性的提高,您可以增加分区的数量。
关于java - 为什么 java 类 WeakReference 不覆盖哈希码和等于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42053241/