(十四):==とequalsの違い

3164 ワード

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メソッドを参照してください.