0

该应用程序将说明用户是否猜到了他介绍的两种颜色组合。

我正在使用 HashMap 来保存“TwoColors”对象和布尔值。TwoColors 类是下一个:

public class TwoColors{
    public MyColor color1;
    public MyColor color2;
    public TwoColors(MyColor color1, MyColor color2){
        this.color1 = color1;
        this.color2 = color2;
    }
    @Override
    public boolean equals(Object obj) {
        TwoColors o = (TwoColors) obj;
        return color1 == o.color1 && color2 == o.color2;
    }
}

MyColor 是一个枚举

public enum MyColor{
     RED,BLUE,YELLOW,BROWN;
}

我测试放置一个 TwoColor 对象键并打印它的值

public static void main(String[] args){
    HashMap<TwoColors, Boolean> hash = new HashMap<TwoColors, Boolean>();
    hash.put(new TwoColors(MyColor.RED,MyColor.BLUE),new Boolean(true));
    System.out.println(hash.get(new TwoColors(MyColor.RED,MyColor.BLUE)));
}

上面的代码输出null虽然我已经覆盖了 TwoColors 的 equals 方法。知道我在这里想念什么吗?

4

2 回答 2

2

当您覆盖等于时,您应该始终覆盖哈希码,如果您在尝试通过调用 get 查找值时不这样做,您的哈希图将找不到它。

阅读这篇文章以获得理解。

您可以使用 Eclipse 获得的默认哈希码:

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((color1 == null) ? 0 : color1.hashCode());
        result = prime * result + ((color2 == null) ? 0 : color2.hashCode());
        return result;
    }

此外,您的 equals 实现不是Production Code,这意味着它没有正确实现。您的实现是开放的,ClassCastException因为您MyColor盲目地将其转换为,因此您的实现也容易出现NullPointerException.

它应该类似于这样:

@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        TwoColors other = (TwoColors) obj;
        if (color1 != other.color1)
            return false;
        if (color2 != other.color2)
            return false;
        return true;
    }

在检查字段值之前检查两个引用是否相同,检查空值,检查类相等性,最后检查字段值。

虽然 Apache 也HashCodeBuilderEqualsBuilder

于 2012-04-25T02:53:45.757 回答
1

从 Java 文档:

hashCode请注意,当此方法 [ ] 被重写时,通常需要重写该方法equals,以维护 hashCode 方法的一般约定,即相等的对象必须具有相等的哈希码。

由于MyColor是一个枚举,因此将此代码添加到您的类中应该可以修复它:

@Override
public int hashCode() {
    return color1.ordinal() + 31*color2.ordinal();
}
于 2012-04-25T03:00:53.177 回答