Java使用什么来确定密钥是否在Map中是重复的?

时间:2008-12-13 03:51:53

标签: java map

我的第一直觉是说每个键都是一个对象,并且有一个哈希码,用于确定是否插入了一个副本。但是,我找不到任何可以支持的东西。有人可以提供一个说明的链接,或在这里提供真正的答案吗?谢谢!

5 个答案:

答案 0 :(得分:19)

Map接口指定如果两个密钥为null,则它们是重复的,否则如果密钥kkey.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使用equalshashCode。您可以编写自己的Map实现,使用完全不同的东西。

答案 3 :(得分:0)

它在键上使用equals()方法。 hashCode()方法只是有效地存储地图的键。

答案 4 :(得分:0)

在这里注意边缘情况。空键并不总是重复。实际上,null键在Map实现之间会引起很大的挫折(请参阅我在Consistency上的帖子)。

例如,空键在HashMaps中是正常的,但在使用自然排序的TreeMap中是不行的,或者在禁止使用空键的ConccurentHashMap中。这里的问题是,如果使用null键,它们会在许多方法上抛出未捕获的异常,并且在重构期间切换实现时会引入可怕的运行时错误。