(十四):==とequalsの違い
public class Person {
String name;
public Person(String name){
this.name = name;
}
@Override
public boolean equals(Object anObject){
// String equals
if(this == anObject) return true;
if(anObject instanceof Person){
Person p = (Person)anObject;
if(p.name.equals(this.name))
return true;
}
return false;
}
}
public class Equals==Test {
public static void main(String[] args) {
String str = new String("abc"); // (1)
String str2 = new String("abc");// (2)
System.out.println(str == str2);// (3)
System.out.println(str.equals(str2));// (4)
Object object = new Object();// (5)
Object object2 = new Object();// (6)
System.out.println(object == object2);// (7)
System.out.println(object.equals(object2));// (8)
Person p = new Person("zhangsan");// (9)
Person p2 = new Person("zhangsan");// (10)
System.out.println(p == p2);// (11)
System.out.println(p.equals(p2));// (12)
}
}
質問1:文(3)(4)の印刷を実行した結果は何ですか.理由を説明する
解答:文(3)(4)の印刷を実行した結果、falseとtrueになります.
解析:str=str 2は参照であり、異なるオブジェクトを指し、メモリアドレスが異なるため、str=str 2はfalseです.Stringのequalsメソッドのソースコードを見てみましょう.これはObjectのequalsメソッドの書き換えです.
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クラスはObjectクラスのequalsメソッドを書き換えたので、オブジェクトの内容を比較します.質問2:文(7)(8)の印刷を実行した結果は何ですか.理由を説明する.
解答:文(7)(8)の印刷を実行した結果、falseとfalseになります.
解析:objectとobject 2は参照であり、異なるオブジェクトを指し、メモリアドレスが異なるため、object=object 2はfalseである.
jdkのソースコードを見ると、equalsメソッドはObjectクラスに定義されているので、すべてのクラスにこのメソッドがあります.Objectクラスは次のようにequalsメソッドを定義します.
public boolean equals(Object obj) {return (this == obj); }
ここから分かるように、Objectクラスのequalsメソッドと==は等価であり、メモリアドレスも比較されている.質問3:文(11)(12)の印刷を実行した結果は何ですか.理由を説明する.
解答:文(11)(12)の印刷を実行した結果、falseとfalseになります.解析:PersonクラスはObjectクラスのequalsメソッドを書き換えていません.
まとめ:==とequals()メソッドの違いは何ですか?equals法が内容を比較しているとは大まかに言えない.「==」は常にメモリアドレスを比較していると言えます.equalsメソッドでは、Objectクラスの階層でメモリアドレスを比較し、"=="と同じです.サブクラスがObjectクラスのequalsメソッドを書き換えた場合,このときこのequalsメソッドがコンテンツと比較される.
要件:クラスをカスタマイズするときに、等しい比較を行う場合は、親クラスのequalsメソッドを書き換える必要があります.equalsメソッドをどのように書き換えるかは、固定されたモード(hashCodeを書き換えるには、次のレッスン)があり、Personクラスでは、2つのPeresonのnameが同じであればtrueを返すべきで、そうでなければfalseを返すべきです.Personクラスのequalsメソッドを参照してください.