2007年10月15日月曜日

equals メソッドと hashCode メソッドのオーバーライド

自作クラスの2つのオブジェクトを equals メソッドを使って意味的に等しい場合 true を返すようにするには
自作クラスで equals メソッドをオーバーライドする必要があります。
Object クラスの equals メソッドはまったく同じオブジェクトの場合 true を返します。

equals メソッドのオーバーライドの例
public class Sample {
    public static void main(String[] args) {
        Tiger t1 = new Tiger(1);
        Tiger t2 = new Tiger(1);
        System.out.println(t1.equals(t2));
    }
}
class Tiger {
    private final int t;
    Tiger(int t) {
        this.t = t;
    }
    public int tigerValue() {
        return t;
    }
    public boolean equals(Object obj) {
        if (obj instanceof Tiger) {
            return ((Tiger)obj).tigerValue() == t;
        } else {
            return false;
        }
    }
}

<出力結果>
true
_______

hashCode メソッドのオーバーライド

自作クラスに equals メソッドをオーバーライドしたら hashCode メソッドもオーバーライドしましょう。
コレクションの HashMap などの Hash がつくクラスはオブジェクトを格納する際にハッシュコードを使用します。
これは検索速度の向上が意図されています。
Object クラスの hashCode メソッドは一意のハッシュコードを返します。
したがって、自作クラスでオーバーライドする際は
意味的に等しい場合は同じハッシュコードを返すようにするのが適切です。

適切かつ最も簡単な方法を Tiger クラスに実装すると

public int hashCode() {
    return t;
}

となります。

自作クラスに hashCode メソッドをオーバーライドしないとコレクションで安全に使用できません。

0 件のコメント: