好的,我了解了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()
  }
}

显然,这会将SetSet<WannaBeKey>更改为Set<WannaBeKeyWrapper>,但是您应该能够解决这个问题。

09-05 08:30