0

アプリケーションは、ユーザーが導入した 2 つの色の組み合わせを推測したかどうかを示します。

「TwoColors」オブジェクトとブール値を保存するために HashMap を使用しています。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)));
}

nullTwoColors の equals メソッドをオーバーライドしましたが、上記のコードは出力します。ここで何が欠けているのですか?

4

2 に答える 2

2

equals をオーバーライドするときは、常に hashcode をオーバーライドする必要があります。 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キャストしているので、あなたの実装はオープンです.MyColorNullPointerException

次のようになります。

@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;
    }

フィールド値をチェックする前に、両方の参照が同じかどうかをチェックし、null をチェックし、クラスが等しいかどうかをチェックし、最後にフィールド値をチェックします。

ApacheにもあHashCodeBuilder​​りますがEqualsBuilder

于 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 に答える