我相信,如果我声明一个 HashMap 并反复向它提供 Map.Entry 的实例,最终哈希码将与另一个哈希码发生冲突,即使这两个键(恰好是我需要的字符串)不同也是如此。
此时 HashMap 和其他使用散列的类将产生不同的散列码,作为内部使用的真正 key 。 (编辑:事实证明这不是真的。请查看所选答案。)
有没有办法得到那个内部 key ?我想要它的原因是因为 32 位 key 比现实世界的 key (可能)是一个较长的字符串更有效的内存和速度。
我可以为我的字符串创建一个哈希码注册表,但如果 Java 已经可以做到这一点,那又何必呢。
最佳答案
否。您无法为系统中的每个可能对象获取唯一的 32 位数字。
对此最简单的证明是,在具有足够内存量的 64 位 JVM 上,您可以轻松拥有超过 2^32 个对象:因此您需要超过 2^32 个不同的哈希值.但是由于您只有 32 位来存储这些散列值,因此您不能获得超过 2^32 个不同的散列值。这称为 Pidgeonhole principle .
还有:HashMap
不产生“唯一哈希码”:它只是将具有相同哈希码的所有元素存储在同一个桶中(在链表中)并使用 equals( )
如果它必须检索其中之一。
关于java - 有没有办法从HashMap这样的对象中获取Java的唯一哈希码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8033742/