Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过身份进行WeakHashMap哈希?_Java_Hash_Weak References_Weakhashmap - Fatal编程技术网

Java 通过身份进行WeakHashMap哈希?

Java 通过身份进行WeakHashMap哈希?,java,hash,weak-references,weakhashmap,Java,Hash,Weak References,Weakhashmap,我不明白,为什么要用它们的hashCode()散列键,并用equals()标识 根据此类的约定,它可以用于将任何实例绑定到任何其他实例。在我看来,这意味着通过身份进行散列和比较 事件在文档中有一个注释,说明如何将用法与String等类混淆: 该类可以很好地处理其 方法不基于对象标识,例如字符串实例。 但是,对于此类可重新创建的关键点对象,自动删除 密钥已被丢弃的WeakHashMap条目可能被证明是无效的 令人困惑 那么,在某些集合库中,这个类有没有实现,它是通过标识散列的?有IdentityH

我不明白,为什么要用它们的
hashCode()
散列键,并用
equals()
标识

根据此类的约定,它可以用于将任何实例绑定到任何其他实例。在我看来,这意味着通过身份进行散列和比较

事件在文档中有一个注释,说明如何将用法与
String
等类混淆:

该类可以很好地处理其 方法不基于对象标识,例如字符串实例。 但是,对于此类可重新创建的关键点对象,自动删除 密钥已被丢弃的WeakHashMap条目可能被证明是无效的 令人困惑


那么,在某些集合库中,这个类有没有实现,它是通过标识散列的?

IdentityHashMap
,但它不是弱的。是的,它不是弱的。为什么需要弱的identitymap?您的用例是特殊的,还是只是被文档弄糊涂了
HashMap
允许您将任何内容用作键/值,并且它也不使用标识。假设我需要将运行时字段添加到
ArrayList
。我将创建
WeakHashMap
并从那里访问它。这些字段随
ArrayList
实例一起自动消失。不幸的是,列表的
hashCode()
基于所有列表元素计算哈希值,
WeakHashMap
即利用它,而
WeakHashMap\hash()
则成为
final
。我认为这是一个糟糕的设计。我不确定我是否仍然理解您的用例,但是将
集合作为一个键将不利于散列。然而,“将运行时字段添加到ArrayList”听起来也有点可疑。