在HashMap中存储多个类

时间:2012-03-09 00:47:39

标签: java hashmap equals hashcode

我有几个共同的类,它们都实现了我想要的相同接口 通过单个HashMap进行管理。

但是这些类不使用相同的equals()和hashcode()实现(哈希码来自不同的 成员;同样在equals())。

这会有用吗?这是可取的吗?

5 个答案:

答案 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)

我认为 是安全的,只要每个类都有hashCodeequals方法遵守这些方法的契约,并且这两个对象是两个不同的类永远不会相等。如果你使用它们作为密钥,你可能会得到更多的冲突哈希码,否则可能会使地图的效率降低。但我不认为它会破坏 - 它们只是被处理为与同一类的两个对象相同的方式与冲突的哈希码。

答案 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)

如果您使用作为键,则hashCodeequals 的不同实现可能会很麻烦。为什么不将这些类用作值并以其他方式定义其键,以便所有键的hashCodeequals实现相同?