【发布时间】:2018-01-29 10:35:57
【问题描述】:
HashMap 中的Hash Collision 或Hashing Collision 并不是一个新话题,我遇到过几个博客和讨论板,它们解释了如何产生Hash Collision 或如何以模糊而详细的方式避免它。我最近在一次采访中遇到了这个问题。我有很多事情要解释,但我认为很难准确地给出正确的解释。抱歉,如果我的问题在这里重复,请引导我找到准确的答案:
- 究竟什么是哈希冲突 - 它是一种功能,还是一种常见的被错误执行但最好避免的现象?
- 究竟是什么导致哈希冲突 - 自定义类的错误定义
hashCode()方法,或者在不完全覆盖hashCode()方法的同时保留equals()方法不被覆盖,或者它不取决于开发人员并且许多流行的 java 库也有可能导致 Hash Collision 的类? - 发生哈希冲突时是否有任何问题或意外?我的意思是我们有什么理由应该避免 Hash Collision?
- Java 是否在对象初始化期间生成或至少尝试为每个类生成唯一的 hashCode?如果不是,那么仅依靠 Java 来确保我的程序不会遇到 JRE 类的 Hash Collision 是否正确?如果不正确,那么如何避免以 String 等 final 类为键的 hashmap 的 hash 冲突?
如果您能分享其中一个或所有问题的答案,我将不胜感激。
【问题讨论】:
-
我建议重新表述这个问题。而不是“分享一篇精彩的博客文章”(这对于 StackOverflow 来说是题外话),为什么不要求正确的分析和解释呢?
-
面试问题,就像家庭作业问题一样,是你应该自己解决的问题。如果您将它们作为问题发布在 StackOverflow 上,您必须提供自己的解决方案,并指出您的解决方案卡住或缺少的地方。就目前而言,这只是一个表明缺乏研究的问题。
-
您通常不会“避免”哈希冲突,而是您通常认为哈希映射会发生并且将会发生的事情。 Java 集合的
HashMap使用的解决方法是维护一个冲突值树(曾经是一个值列表)。如果您发现自己有太多冲突,您可能需要考虑调整哈希图中存储桶的数量。而且你的问题太宽泛了,我同意其他cmets,你应该缩小你想在这里问的范围。 -
您确实指定这些是面试问题。所以它们与家庭作业问题相同。清脆与否 - 他们不遵循 SO 的指导方针(我很惊讶人们支持这个问题)。一方面,您应该始终在一个帖子中发布一个问题。
标签: java collections collision hash-collision