我有几个共同的类,它们都实现了我想要的相同接口 通过单个HashMap进行管理。
但是这些类不使用相同的equals()和hashcode()实现(哈希码来自不同的 成员;同样在equals())。
这会有用吗?这是可取的吗?
答案 0 :(得分:0)
防止哈希冲突的一个好主意是使用类'hashcode来计算正在计算的任何哈希码:
@Override
public int hashCode()
{
// Here you calculate your hashcode into variable h...
return h ^ this.getClass().hashCode();
}
您可以使用equals
执行类似操作,以防止不同类的对象之间的相等:
@Override
public boolean equals(Object other)
{
if (this.getClass() != other.getClass()) return false;
// Rest of you code here...
}
除此之外,你所做的事情是完全合理和有效的。
答案 1 :(得分:0)
我认为 是安全的,只要每个类都有hashCode
和equals
方法遵守这些方法的契约,并且这两个对象是两个不同的类永远不会相等。如果你使用它们作为密钥,你可能会得到更多的冲突哈希码,否则可能会使地图的效率降低。但我不认为它会破坏 - 它们只是被处理为与同一类的两个对象相同的方式与冲突的哈希码。
答案 2 :(得分:0)
我假设您正在讨论在HashMap或HashSet中使用这些类。
在这种情况下,equals方法看起来应该是这样的,并且可以在您的场景中使用:
public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj == this)
return true;
if (obj.getClass() != getClass())
return false;
// perform actual comparison
...
}
答案 3 :(得分:0)
hashCode()
和equals()
的不同内容通常不是问题,只要equals()
将返回true
当且仅当比较的对象真正相等时才会返回HashMap
。
否则,可能发生的最坏情况是当有问题的对象被用作{{1}}密钥时,哈希冲突率会增加 - 但是,这只会影响代码的性能,而不会影响其正确性。
答案 4 :(得分:0)
如果您使用类作为键,则hashCode
和equals
的不同实现可能会很麻烦。为什么不将这些类用作值并以其他方式定义其键,以便所有键的hashCode
和equals
实现相同?