2 つの String オブジェクトを作成し、それらを比較するために == を使用すると false が返され、メソッドに equals を使用すると true が返されることは誰もが知っています。しかし、デフォルトでは equals メソッドは == のみを実装します。次に、どのように true を返しますか? == が返すものは何でも返す必要がありますか??
5 に答える
はい、デフォルトで 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==s2
false
どちらもヒープ上の異なるオブジェクトを参照しているため、戻ります。これまでs1.equals(s2)
に返さtrue
れたのは、オブジェクトが文字列に基づいて比較されるクラスequals
内で定義されたものです。String
String
contents
String クラスの equals メソッドはオーバーライドされ、両方の String のすべての文字が等しいかどうかを確認しようとします。見つかった場合は true を返します。そのため、String クラスの equals メソッドの動作は、通常のオブジェクト クラスの実装とは異なります。
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;
}
.equals()
文字列が同一かどうかを調べます ei. 同じ文字があります。==
ポインターが同じオブジェクトを指しているかどうかのみをチェックします。同じ文字で異なるオブジェクトを使用できる.equals()
ため、それらを比較するために使用する必要があります
String
Java のクラスは、参照を比較するのではなく、2 つの文字列の内容を比較するようequals
にクラスのメソッドをオーバーライドします(クラス内のデフォルトの実装)。Object
Object
以下のクラスの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;
}