5

2 つの String オブジェクトを作成し、それらを比較するために == を使用すると false が返され、メソッドに equals を使用すると true が返されることは誰もが知っています。しかし、デフォルトでは equals メソッドは == のみを実装します。次に、どのように true を返しますか? == が返すものは何でも返す必要がありますか??

4

5 に答える 5

8

はい、デフォルトで equals メソッドは class に実装され==ますObject。ただしequals、独自のクラスでメソッドをオーバーライドしてequality、同じクラスの 2 つのオブジェクト間で行われる方法を変更できます。たとえばequals、クラスのメソッドはString次のようにオーバーライドされます。

public boolean equals(Object anObject) {
          if (this == anObject) {
              return true;
          }
          if (anObject instanceof String) {
              String anotherString = (String)anObject;
              int n = count;
              if (n == anotherString.count) {
                  char v1[] = value;
                  char v2[] = anotherString.value;
                  int i = offset;
                  int j = anotherString.offset;
                  while (n-- != 0) {
                      if (v1[i++] != v2[j++])
                          return false;
                  }
                  return true;
              }
          }
          return false;
      }

したがって、これが次のコードの理由です。

String s1 = new String("java");
String s2 = new String("java");

s1==s2falseどちらもヒープ上の異なるオブジェクトを参照しているため、戻ります。これまでs1.equals(s2)に返さtrueれたのは、オブジェクトが文字列に基づいて比較されるクラスequals内で定義されたものです。StringStringcontents

于 2013-03-23T10:17:53.603 に答える
1

String クラスの equals メソッドはオーバーライドされ、両方の String のすべての文字が等しいかどうかを確認しようとします。見つかった場合は true を返します。そのため、String クラスの equals メソッドの動作は、通常のオブジェクト クラスの実装とは異なります。

于 2013-03-23T10:17:30.737 に答える
0

equalsメソッドはもともとObjectクラスのメソッドです。また、Java のすべてのクラスは、Objectデフォルトでクラスを拡張します。現在、クラスが とは異なる動作をするようにequalsメソッドがオーバーライドされています。String==

それはjavadocで完全に説明されています:

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

その実装は次のようになります。

@override
public boolean equals(Object anObject) {
// This check is just for the case when exact same String object is passed
if (this == anObject) {
    return true;
}
// After this only real implementation of equals start which you might be looking for
// For other cases checks start from here
if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = count;
    if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
        return false;
    }
    return true;
    }
}
return false;
}
于 2013-03-23T10:16:48.213 に答える
0

.equals()文字列が同一かどうかを調べます ei. 同じ文字があります。==ポインターが同じオブジェクトを指しているかどうかのみをチェックします。同じ文字で異なるオブジェクトを使用できる.equals()ため、それらを比較するために使用する必要があります

于 2013-03-23T10:18:30.163 に答える
0

StringJava のクラスは、参照を比較するのではなく、2 つの文字列の内容を比較するようequalsにクラスのメソッドをオーバーライドします(クラス内のデフォルトの実装)。ObjectObject

以下のクラスのequalsメソッド実装を参照してください。String

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    }
于 2013-03-23T10:27:53.817 に答える