Java==equalsとの違いをまとめました。
Javaの中で==equalsとの違いは、わずかな人が完全に正しいと言えるような気がします。
よくあるエラーの答えは、==ベースタイプの対比は同じかどうか、参照タイプの対比は参照が同じかどうかです。equalsは比較値が同じかどうかである。
なぜそれが間違っているかというと、本文を読み終わったら、=とequalsの解読が分かります。
1、=読み解く
基本タイプと引用タイプ==の作用効果は異なります。
基本タイプ:比較は同じ値ですか?引用の種類:比較は参照が同じかどうかです。
コードの例:
2、equals解読
equalsは本質的には==ですが、StringやIntegerなどでequals方法を書き換えて、それを値比較に変えました。下のコードを見れば分かります。
まずデフォルトでequalsは同じ値のオブジェクトを比較します。コードは以下の通りです。
問題が来ました。同じ値のStringオブジェクトが二つありますが、なぜtrueに戻りましたか?コードは以下の通りです
3、まとめ
全体としては、==は基本的なタイプにとって値比較であり、参照のタイプにとっては比較的参照である。equalsはデフォルトでは参照比較ですが、多くの種類がequals方法を書き換えました。例えば、String、Integerなどは値比較になりますので、equalsは値が等しいかどうかを比較します。
よくあるエラーの答えは、==ベースタイプの対比は同じかどうか、参照タイプの対比は参照が同じかどうかです。equalsは比較値が同じかどうかである。
なぜそれが間違っているかというと、本文を読み終わったら、=とequalsの解読が分かります。
1、=読み解く
基本タイプと引用タイプ==の作用効果は異なります。
基本タイプ:比較は同じ値ですか?引用の種類:比較は参照が同じかどうかです。
コードの例:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
コードの解読:xとyは同じ参照なので、==trueです。new Stringはメモリ空間を書き換えています。だから=結果はfalseです。equalsはずっと値です。結果はtrueです。2、equals解読
equalsは本質的には==ですが、StringやIntegerなどでequals方法を書き換えて、それを値比較に変えました。下のコードを見れば分かります。
まずデフォルトでequalsは同じ値のオブジェクトを比較します。コードは以下の通りです。
class Cat {
public Cat(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Cat c1 = new Cat(" ");
Cat c2 = new Cat(" ");
System.out.println(c1.equals(c2)); // false
アウトプットの結果は予想外で、なんとfalseですか?これはどういうことですか?equalsのソースコードを見れば分かります。ソースは以下の通りです。
public boolean equals(Object obj) {
return (this == obj);
}
もともとequalsは本質的に==です。問題が来ました。同じ値のStringオブジェクトが二つありますが、なぜtrueに戻りましたか?コードは以下の通りです
String s1 = new String(" ");
String s2 = new String(" ");
System.out.println(s1.equals(s2)); // true
同じように、Stringのequals方法に入ると、答えが見つかりました。コードは以下の通りです。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
StringがObjectを書き直したequals方法で、引用比較を値比較に変えました。3、まとめ
全体としては、==は基本的なタイプにとって値比較であり、参照のタイプにとっては比較的参照である。equalsはデフォルトでは参照比較ですが、多くの種類がequals方法を書き換えました。例えば、String、Integerなどは値比較になりますので、equalsは値が等しいかどうかを比較します。