Java 在HashMap中存储多个类

Java 在HashMap中存储多个类,java,hashmap,equals,hashcode,Java,Hashmap,Equals,Hashcode,我有几个共同的类,它们都实现了我想要的相同接口 通过单个HashMap进行管理 但是这些类不使用相同的equals和hashcode实现,而hashcode是从不同的类派生的 成员;同样,在平等问题上也是如此 这样行吗?建议这样做吗?防止哈希冲突的一个好办法是对使用类“hashcode: @Override public int hashCode() { // Here you calculate your hashcode into variable h... return h

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

但是这些类不使用相同的equals和hashcode实现,而hashcode是从不同的类派生的 成员;同样,在平等问题上也是如此


这样行吗?建议这样做吗?

防止哈希冲突的一个好办法是对使用类“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...
}

除此之外,您所做的是完全合理和有效的。

我认为这样做是安全的,只要每个类都有hashCode和equals方法,这些方法遵循这些方法的约定,并且两个不同类的两个对象永远不会彼此相等。如果将它们用作键,则可能会得到比其他方式更多的冲突哈希代码,这可能会使映射的效率稍微降低。但我不认为它会崩溃——它们只是被当作同一类的两个对象,用冲突的哈希代码处理

我假设您正在谈论在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
        ...
    }

hashCode和equals的不同实现通常不是问题,只要equals在且仅在比较对象真正相等时返回true


否则,当所讨论的对象用作HashMap键时,可能发生的最坏情况是哈希冲突的增加率-然而,这只会影响代码的性能,而不会影响代码的正确性…

如果将类用作键,hashCode和equals的不同实现可能会带来麻烦。为什么不使用类作为值并以其他方式定义它们的键,这样hashCode和equals实现对所有键都是相同的?

它们是键还是值?两个不同类的对象可以相等吗?我认为最好使用instanceof。如果other属于这个类的子类呢?…最好也检查other是否为null!instanceof在null时返回false。@路易斯瓦瑟曼:我指的是迭戈在另一个上盲目调用getClass的事实……我想,但如果他真的使用instanceof来代替,这是值得澄清的。如果你有任何例子的话,我会感兴趣的是它们作为键可能会带来麻烦的方式?这感觉有点不确定,但我想不出有什么。除了增加散列键冲突之外,这应该是可行的,但是反射的使用不管多么轻量级,类对象上的标识匹配都很麻烦。我会用instanceof来代替。。。