java - 哈希时不可避免的碰撞?

标签 java map hashmap

如果我创建一个新的 Map:

Map<Integer,String> map = new HashMap<Integer,String>();

然后我调用 map.put() 多次,每次调用一个唯一的键,比如说,一百万次,是否会发生冲突,或者如果 key 是唯一的?

最佳答案

如果 key 是唯一的,则散列法不能保证不会发生冲突。事实上,唯一需要的是相等的对象具有相同的哈希码。碰撞次数决定了检索的效率(碰撞越少,接近 O(1),碰撞越多,接近 O(n))。

对象的哈希码是什么取决于它是什么类型。例如,一个字符串的默认哈希码是

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

这必然将字符串的复杂性简化为一个数字——绝对有可能用两个不同的字符串达到相同的哈希码,尽管这种情况非常罕见。

如果两个事物散列为同一事物,则 hashmap 使用 .equals 来确定特定键是否匹配。这就是为什么同时重写 hashCode()equals() 并确保相等的事物具有相同的哈希码非常重要。

关于java - 哈希时不可避免的碰撞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26519943/

相关文章:

java - 具有一个 HashMap 的 HashMap 数组

vector - 如何将一个元素添加到将字符串与字符串向量配对的 HashMap 的值中?

java - 使用 Servlet 注释进行映射不起作用

c++ - 什么时候必须使用初始化列表来初始化 C++ 类成员?

performance - 防止 OpenJPA N+1 在 map 上选择性能问题

Java - 为什么 Map.put() 覆盖而 Set.add() 不覆盖?

java - Amazon S3s key 背后的数据结构(过滤数据结构)

java - 序列化 PHP => 反序列化 JAVA/Serialize for php in string format

java - Google 云端点方法总是引发 NullPointerException,为什么?

java - 如果编译时异常将在运行时捕获,为什么我需要处理它们