4

を使用してArrayListおり、プログラムのある時点で、contains メソッドを使用して、特定のアイテムが に含まれているかどうかを確認していArrayListます。ArrayListは type 、カスタム クラスのオブジェクトを保持し、そのCharProfile中に char が含まれているかどうかを確認しています。

そのため、contains メソッドで equals メソッドを使用していると思います。のようなものですがCharProfile.contains(char)、機能していません。

CharProfile の equals メソッドをオーバーライドしました。

@Override
public boolean equals(Object o) {
    if (this.character == (Character)o) {
        return true;
    }
    else {
        return false;
    }
}

したがって、CharProfile が使用しようとしているときに equals メソッドを使用する必要がありますよね? では、なぜうまくいかないのでしょうか。

(「機能しない」という点では、contains常にfalseを返すという事実を指しています。)

4

5 に答える 5

9

==を使用して参照型を比較していますが、これは間違っています。equals適切なnullチェックを追加して、を使用する必要があります。

しかし、これはほんの始まりに過ぎません。CharProfile主な問題は、オブジェクトをオブジェクトと比較しようとしていることですCharacter。代わりにおそらくこれが必要です:

public boolean equals(Object o) {
  return o instanceof CharProfile 
     && this.character.equals((CharProfile)o).character;
}

characterこれは、フィールドがnullになることはないと想定しています。nullになる可能性がある場合は、逆参照する前にもそれを確認する必要があります。

于 2012-10-29T12:49:08.863 に答える
2

演算子のデフォルトの動作である参照の同等性をテストするように、equalsをオーバーライドしています==

于 2012-10-29T12:50:13.747 に答える
1

equals() メソッドを使用する必要があり、hashCode() メソッドもオーバーライドすることを忘れないでください。彼らは手を取り合って行きます。

これを知らない人もいますが、Eclipse を使用している場合は、右クリックして [ソース] -> [ハッシュコード() および equals() を生成] を選択します...

ただし、この便利さを使用する前に、まずその目的を理解することをお勧めします。

于 2012-10-29T12:58:23.727 に答える
1

等号()を使用する必要があります。また、ワンライナーにして、キャストをより明確にすることもできます。

@Override
public boolean equals(Object o) {
    return o instanceof Character && this.character.equals(Character.class.cast(o));
}
于 2012-10-29T12:51:30.550 に答える
0

たとえば、CharProfile次のようになります。

List<CharProfile> list = new ArrayList<CharProfile>();
list.add(new CharProfile('a'));
list.add(new CharProfile('b'));
list.add(new CharProfile('c'));

が実行されると、JVM は のメソッドをlist.contains('a')呼び出しません。Override equals()CharProfile

より明確にするために;

public class Data {
    public boolean equals(Object o) {
        System.out.println("I am data");
        return false;
    }
}

が実行されると、JVM は のメソッドをlist.contains(new Data())呼び出しません。これで、 I am dataのようなメッセージが表示されます。.Override equals()Data

于 2012-10-29T13:01:12.463 に答える