我是学计算机的,所以如果我说的太荒谬,请多多包涵。它对我来说确实如此,这就是为什么我在这里寻找答案。 我阅读了如何在 Java 中散列字符串,然后查看了 ASCII 表。字母“d”和“n”分别哈希为 100 和 110。现在,如果我要用 Java 创建一个全新的 hashmap,默认情况下它有 10 个桶。因此,即使哈希码是唯一的,mod 10 它们都是 0。这会导致冲突。 在 1 个字符串上发生冲突并不适合我,那么我描述的过程是否正确? 提前致谢。
最佳答案
您描述的可能是正确的,由于 pigeonhole principle,两者将落在同一个桶中,这基本上意味着如果你的元素多于放置它们的孔,那么两个或更多的元素最终会落在同一个孔上。在这种情况下,仅考虑 95 个可打印的 ASCII字符,原理是每个洞至少有10个(不考虑实际值,只考虑数量)。
但是,shazin 的答案也是正确的,因为哈希值实际上并未用作映射中值的标识,而是用于查找 kay/value 对所属的桶,然后在中查找值使用它们的 equals()
方法检查存储桶是否相等(或者使用 ==
,如果使用 IdentityHashMap
。)
关于Java 默认字符串哈希函数在单个字符串上产生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30971703/