java - HashSet 和 HashMap 在 Java 中是如何工作的?

标签 java hashmap hashset

我对 HashSetHashMap 在 java 中的内部实现有点困惑。

这是我的理解,如有错误请指正

HashSetHashMap 都不允许重复元素。

HashSetHashMap 支持,因此在 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 。对于该值,使用虚拟值。因此,HashSetcontains(element) 只是调用支持 HashMapcontainsKey(element)

关于java - HashSet 和 HashMap 在 Java 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29458498/

相关文章:

java - 子集数

java - 我应该如何迭代 HashSet、删除某些元素并更改其他元素?

java - 为什么 Kernel32 OpenProcess 函数返回 null?

java - 用数字替换符号

c# - 为什么我不能在没有枚举的情况下从 HashSet 中检索项目?

java - HashMap和HashSet根据执行顺序不同的执行时间?

java - 将 Java webapp 部署到在 Docker 容器中运行的 Tomcat 8

java - 如何根据hashmap中的值合并键?

java - searchByEmail 方法不起作用

c# - 使用现有的哈希集作为键来创建新字典