我有一个生成 String 对象的类:
key = "K:" + this.hashCode();
此类不继承自任何其他类,也不会覆盖 hashCode()。我有一种情况,我得到重复的键,所以一个对象的两个不同实例返回完全相同的 hashCode()。
这怎么会发生,可以做些什么来避免它?这个类是我正在使用的 API 的一部分,所以我无法控制它,但是如果有某种方法我可以在创建这个对象的实例时等待或其他什么,那么类似的东西可以工作。
我有一个生成 String 对象的类:
key = "K:" + this.hashCode();
此类不继承自任何其他类,也不会覆盖 hashCode()。我有一种情况,我得到重复的键,所以一个对象的两个不同实例返回完全相同的 hashCode()。
这怎么会发生,可以做些什么来避免它?这个类是我正在使用的 API 的一部分,所以我无法控制它,但是如果有某种方法我可以在创建这个对象的实例时等待或其他什么,那么类似的东西可以工作。
它可能会发生。您可能会为两个不同的对象获得相同的哈希码:
根据Object.hashCode()文档:
如果根据 equals(java.lang.Object) 方法,如果两个对象不相等,则不需要对两个对象中的每一个调用 hashCode 方法都必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
可以做些什么来避免它?
以下是其他 SO 问题中建议的一些最佳实践:
尽管如此,这些只是最佳实践,不能保证避免使用相同的哈希码。在您的情况下,我认为您根本不应该依赖哈希码。
If the HashCodes are equal it is not a proof that their object are equal!
However if the HashCodes are UNequal the object are UNequal.
Assumed that no random values are chosen during the calculation!
I recommend generating the HashCode from your IDE