好的,我了解了equals和hashcode的工作原理以及如何在hashmap中使用它们。
但是这个问题让我脑海中浮现了,如果我有一个第三方对象,该对象没有重写的哈希码和相等值,甚至不允许我对其进行修改。
考虑以下类(class):
//Unmodifiable class
public final class WannaBeKey{
private String id;
private String keyName;
//Can be many more fields
public String getId()
{
return id;
}
public String getKeyName()
{
return id;
}
//no hashcode or equals :(
}
现在,我想将该类作为我的Hashmap键,显然,如果没有equals和hashcode,它将无法正常工作。我想知道有什么办法可以处理这种情况吗?我无法想到任何事情,或者我无法解决。
谢谢。
最佳答案
我以前遇到过这种情况,并通过如下方式为WannaBeKey创建包装器来解决此问题:
public class WannaBeKeyWrapper {
private final WannaBeKey key;
public WannaBeKeyWrapper(WannaBeKey key) {
this.key = key;
}
public boolean equals(Object obj) {
// Insert equality based on WannaBeKey
}
public int hashCode() {
// Insert custom hashcode in accordance with http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()
}
}
显然,这会将
Set
从Set<WannaBeKey>
更改为Set<WannaBeKeyWrapper>
,但是您应该能够解决这个问题。