我对 HashSet
和 HashMap
在 java 中的内部实现有点困惑。
这是我的理解,如有错误请指正
HashSet
或 HashMap
都不允许重复元素。
HashSet
由 HashMap
支持,因此在 HashSet
中我们调用 .add(element)
,我们在元素上调用 hashCode()
方法,并在内部对内部 HashMap
执行 put(k,v)
,其中键是 hashCode
,值是实际对象。因此,如果我们尝试将相同的对象添加到 Set
,它会看到 hashCode
已经存在,然后用新值替换旧值。
但是,当我阅读将我们自己的对象作为键存储在 HashMap
中时 HashMap
的工作原理时,这对我来说似乎不一致。
在这种情况下,我们必须覆盖 hashCode()
和 equals()
方法并使它们彼此一致,因为如果我们找到具有相同 hashCode 的键
,它们将进入同一个桶,然后为了区分具有相同 hashCode
的所有条目,我们必须遍历条目列表以调用方法 equals( )
在每个键上找到一个匹配项。
因此,在这种情况下,我们允许拥有相同的 hashCode
并且我们创建了一个存储桶,其中包含具有相同 hashCode
的所有对象的列表,但是使用的是 HashSet
,如果我们已经找到一个 hashCode
,我们用新值替换旧值。
我有点困惑,有人可以向我澄清一下吗?
最佳答案
你对 HashMap
的行为是正确的,但你对 HashSet
的实现是错误的。
HashSet
在内部由 HashMap
支持,但是您添加到 HashSet
的元素用作支持 HashMap
。对于该值,使用虚拟值。因此,HashSet
的 contains(element)
只是调用支持 HashMap
的 containsKey(element)
。
关于java - HashSet 和 HashMap 在 Java 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29458498/