3

equals() が明らかにオーバーライドされていることに驚きましたArrayList<String>。Collection<> の contains() は、参照ではなく、明らかに値を比較するためです。もちろん、 の場合Collection<Object>、参照は比較されます。以下のプログラムでは、2 行目で false になるべきではありませんか?

public static void main(String[] args) {
    ArrayList<String> al = new ArrayList<String>();
    al.add("Obama");
    al.add("Reagan");
    al.add("Bush");
    al.add("Nyquist");
    StringBuffer sb = new StringBuffer();
    sb.append("Bush");

    System.out.println("compares values? using constants " + al.contains("Bush"));
    System.out.println("compares values? using local variable " + al.contains(sb.toString()));
}

run:
compares values? using constants true
compares values? using local variable true
4

3 に答える 3

4

リストのJavdaocsはあなたの友達です。List.contains()に依存してい.equals()ます:

boolean contains(Object o)
このリストに指定された要素が含まれている場合はtrueを返します。より正式には、このリストに(o == null?e == null:o.equals(e))のような要素eが少なくとも1つ含まれている場合にのみ、trueを返します。

String.equals()Stringsの内容(文字)を比較します:

public boolean equals(Object anObject)
この文字列を指定されたオブジェクトと比較します。結果は、引数がnullでなく、このオブジェクトと同じ文字シーケンスを表すStringオブジェクトである場合にのみtrueになります。

于 2013-01-03T01:57:45.300 に答える
4

これはまさに期待どおりの出力でありCollection<Object>、違いはありません。Collection特に指定のない限り、すべての型で を使用し、異なる実装は契約.equals(Object)に違反します。Collection(明確にするために、 aStringを anにアップキャストしても、そのメソッドObjectの動作は変わりません。)equals

いくつかの前例があります -- たとえば、TreeSet比較ベースの等価性を使用する実装と、IdentityHashSet参照等価性を使用する実装を参照してください - しかし、これらは通常、等価性の 2 つの概念が一致する場合、または重要で異常な必要性がある場合にのみ使用する必要があります。

于 2013-01-03T01:56:57.100 に答える
0

System.out.println(sb.toString().equals("Bush")); を試すことができます。あなたのクラスで、それが何を返すかを見てください。true が返されます。したがって、2番目のケースでは、trueを返す/印刷します。

于 2013-01-03T04:11:35.287 に答える