2

クラス Cell をキーとして HashMap を使用しようとしています。ただし、アイテムを HashMap に配置した後、そのアイテムで contains を呼び出すと、false が返されます。

public static void main(String args[]) {
        HashMap<Cell, String> map = new HashMap<Cell, String>();
        map.put(new Cell(0,0), "Bob");
        System.out.println(map.containsKey(new Cell(0,0)));
        System.out.println(new Cell(0,0).equals(new Cell(0,0)));
}

Map docs containsKey uses .equals() によると、これは false と true を出力しますが、true と true を出力する必要があります。私は何を間違っていますか?

4

4 に答える 4

4

equals()これは、hashCode()実装されていないことが原因である可能性が最も高いです。Java では、経験則として、一方を実装する場合、もう一方を実装する必要があります。HashMapあなたの場合、それらを利用するので必須です。

2 つの別々のアドレスを持つ 2 つの別々のオブジェクトを作成しました。これらのメソッドがなければ、JVM はオブジェクトが「同じ」であることを認識できません。

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()を参照してください。

于 2013-10-03T18:49:59.883 に答える
1

HashMapa の実装方法を検討してください。配置するときは、最初にオブジェクトを計算して、オブジェクトhashCode()を配置するバケットを見つけます。オブジェクトを取得しようとすると、オブジェクトを再度取得しhashCode()、ターゲット バケットを識別し、バケット内のリンク リストを調べて、equals()各オブジェクトに対して呼び出します。 . 一致が見つかった場合は戻ります。

つまり、 を使用するときは、とHashMapの正しく一致する実装が必要です。equals()hashCode()

hashCode()から継承されたデフォルトのメソッドは、オブジェクト参照が同じでない限り、Object同じものを正しく返しません。hashCode()あなたの場合、そうではありません。

于 2013-10-03T18:49:18.823 に答える
0

new Cell(0,0) を数回呼び出すと、異なるハッシュ コードを持つ異なるオブジェクトが生成されます。Cell クラスの hashCode を実装する必要があります。

于 2013-10-03T18:49:28.043 に答える
0

でユーザー定義クラスを使用するためにも必要なhashcode()関数 forを実装するのを忘れている可能性があります。関数を実装するための簡単で一般的に正確な方法を次に示します。CellHashMaphashcode()

int hashcode(){
    return (field1.toString()+field2.toString()+...+fieldN.toString()).hashcode();
}

クラス内のフィールドはどこfield1にありますか。fieldNフィールドがプリミティブ (つまりint) の場合は、toString().

于 2013-10-03T18:49:28.960 に答える