我的第一直觉是说每个键都是一个对象,并且有一个哈希码,用于确定是否插入了一个副本。但是,我找不到任何可以支持的东西。有人可以提供一个说明的链接,或在这里提供真正的答案吗?谢谢!
答案 0 :(得分:19)
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
实现如何执行该检查,而HashMap
将使用哈希码来缩小它将使用equals
检查的潜在密钥方法。所以在实践中,对于典型的基于散列的映射,要检查重复,映射将采用哈希码(可能是某种大小的mod),并使用equals
来比较任何键,其相同大小的哈希码mod给出相同的余数
答案 1 :(得分:3)
阅读错误的问题,但上面的人的答案是正确的,我的链接提供了如何确定(等于方法)的答案。查看链接中的contains和get方法。
地图如何插入: 地图中不能有重复的密钥。如果找到重复键,它将使用新值替换旧值。这是Map接口的link。此外,如果您查看put(K键,V值)方法,它还会解释地图的工作原理。希望有所帮助。
答案 2 :(得分:1)
我假设您指的是java.util.Map
,它是标准Java库中提供的接口。确定密钥是否重复的方法由特定实现决定。例如,java.util.HashMap
使用equals
和hashCode
。您可以编写自己的Map实现,使用完全不同的东西。
答案 3 :(得分:0)
它在键上使用equals()方法。 hashCode()方法只是有效地存储地图的键。
答案 4 :(得分:0)
在这里注意边缘情况。空键并不总是重复。实际上,null键在Map实现之间会引起很大的挫折(请参阅我在Consistency上的帖子)。
例如,空键在HashMaps中是正常的,但在使用自然排序的TreeMap中是不行的,或者在禁止使用空键的ConccurentHashMap中。这里的问题是,如果使用null键,它们会在许多方法上抛出未捕获的异常,并且在重构期间切换实现时会引入可怕的运行时错误。