-2
public class ObjectEqualsComparison {
      public static void main(String[] args) {      
           Object ob1 = new Object();  // address location 0×1234 
           Object ob2 = new Object();  // address location 0×2345 

           System.out.println(ob1 == ob2); // prints false correct
           System.out.println(ob1.equals(ob2)); //prints false which is incorrect//it should be true.

           //ob1 == ob2 gives false which is correct since you are comparing address/references .
           //ob1.equals(ob2) is also giving false.can you tell me why since we are comparing contents       
        }
}

編集::私の質問は、equals()メソッドをオーバーライドする必要がありますか?そうであれば、equals()オーバーライドされたメソッドはどのようになりますか?助けてください

4

2 に答える 2

1

タイプのインスタンスを比較しているため、の出力System.out.println(ob1.equals(ob2));は正しいですobject。オーバーライドするタイプのインスタンスを比較している場合equals、それは別の話になります!

たとえば、次の場合:

class SomeType{

    private Object comparisonField;

    public SomeType(Object comparisonValue){
        this.comparisonField = comparisonValue;
    }

    @overrides
    public int getHashCode(Object other){
        if(this.comparisonField == null)
            return super.getHashCode();

        return this.comparisonField.getHashCode();
    }

    @overrides
    public boolean equals(Object other){
        if(comparisonField == null || other == null)
           return super.equals(other);

        return comparisonField.equals(((SomeType)other).comparisonField);
    }
}

比較する場合:

SomeType inst1 = new SomeType("SAME VALUE");
SomeType inst2 = new SomeType("SAME VALUE");

bool areEqual = inst1.equals(inst2);  // calls the overriden equals method on SomeType
                                      //   which would return TRUE 

// but if you use object:

Object obj1 = new Object();
Object obj2 = new Object();

bool areEqual = obj1.equals(obj2);    // will call equals on Object;
                                      //   and always return false;
于 2013-03-12T15:59:30.973 に答える
1

Object にある equals() のデフォルトの実装は、2 つのオブジェクトが同じインスタンス、つまりメモリ内の同じオブジェクトである場合にのみ true を返します。2 つの個別の Object インスタンスを作成するたびに、それらはメモリ内の同じオブジェクトを参照しないため、false が返されます。

Miky が指摘したように、クラスで equals() をオーバーライドすることにより、そのデフォルトの動作を変更して、独自の等価セマンティクスを提供できます。

ただし、クラス (たとえば、彼の例では SomeType インスタンス) を Object にキャストすると equals() の結果が変わるという点で、Miky は正しくありません。

boolean areEqual = obj1.equals(obj2);

そのスーパータイプである Object. それがポリモーフィズムの力です。

したがって、元の質問に答えるには、独自のクラスを作成し、そのクラスで equals() をオーバーライドして、クラスにとって意味のある同等性チェックを実行する実装を作成する必要があります。たとえば、Customer クラスがあり、顧客が電子メール アドレスによって一意に定義されている場合、Customer.equals() で電子メール アドレスを比較し、同じであれば true を返します。

equals() の署名は Object 引数を受け入れることに注意してください。適切に構築された equals 実装は、引数が null であるかどうか、およびそれが同じ型のインスタンスであるかどうかをチェックします。equals() をオーバーライドする場合は、hashCode() をオーバーライドする必要があることにも注意してください。

equals() と hashCode() のオーバーライドについては、簡単に見つけられる情報がたくさんあります。開始するのに適した場所は、常に「Effective Java」の本です。

于 2013-03-12T17:05:02.577 に答える