java - 为什么 java 类 WeakReference 不覆盖哈希码和等于

标签 java weak-references

我原以为 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/

相关文章:

java - 如何遍历具有特定变量的对象列表?

java - 从公历转换为儒略历

java - XML 编码 + 项目结构

C++ weak_ptr.lock() 段错误

Java:强/软/弱/幻像引用之间的区别

Java从mysql数据库错误填充jcombobox

java - 向继承方法添加注释的最佳方法

java - WeakHashMap 是否在 full GC 期间被清除?

ios - IBoutlet 如何保持初始值变弱?意味着其他一些强大的物体指向?

Python 函数返回值的weakref