我的第一直觉是说每个键都是一个对象,并且有一个哈希码,用于确定是否插入了重复项。但是,我找不到任何可以肯定的支持。有人可以提供一个链接,或者在这里提供真正的答案吗?谢谢!
5 回答
该Map
接口指定如果两个键是null
重复的,否则如果存在k
这样的键key.equals(k)
,则存在重复。请参阅此处的 contains 或 get 方法:
http://java.sun.com/javase/6/docs/api/java/util/Map.html#containsKey(java.lang.Object)
但是,Map
如何执行该检查取决于实现,并且 aHashMap
将使用哈希码来缩小它将使用该equals
方法检查的潜在键。因此,在实践中,对于典型的基于哈希的映射,要检查重复映射,映射将采用哈希码(可能是某种大小的模数),并用于equals
与哈希码模数相同大小给出相同余数的任何键进行比较。
读错了问题,但上面的人的答案是正确的,我的链接提供了如何确定的答案(equals方法)。查看链接中的 contains 和 get 方法。
地图如何插入:地图中不能有重复的键。如果您发现重复键,它将用新值替换旧值。这是地图界面的链接。此外,如果你看一下 put(K key, V value) 方法,它还解释了 map 的工作原理。希望有帮助。
我假设您指的java.util.Map
是标准 Java 库中提供的接口。确定密钥是否重复的方法由具体实现决定。Ajava.util.HashMap
使用equals
和hashCode
,例如。您可以编写自己的 Map 实现,使用完全不同的东西。
它在键上使用 equals() 方法。hashCode() 方法只是帮助有效地存储地图的键。
小心这里的边缘情况。空键并不总是重复的。事实上,空键会在 Map 实现之间造成很大的挫败感(请参阅我关于一致性的帖子)。
例如,在 HashMap 中空键是可以的,但在使用自然排序的 TreeMap 或禁止空键的 ConccurentHashMap 中则不行。这里的问题是,如果您使用 null 键,它们会在许多方法上抛出未捕获的异常,并且当您在重构期间切换实现时会引入可怕的运行时错误。