2017-10-14 5 views
0

私は長い間、オブジェクトはequals()を使って比較されたと考えました。つまり、hashcode()を使用しています。つまり、2つのオブジェクトが同じハッシュコードを持つ場合、trueを返します。ソースコードからJavaでオブジェクトを比較する方法は?

のequals()メソッドは:

@see java.lang.System #identityHashCode 
public boolean equals(Object obj) { 
     return (this == obj); 
    } 

は、だから私は、これを作成しました:今

@Override 
    public final boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
    } 

    @Override 
    public int hashCode() { 
     //The main point of 0 is to check how equals actually work 
     return 0; 
    } 

:iがのhashCode()をオーバーライドしまた

public static void main(String[] args) { 
     Dog rover = new Dog("Rover"); 
     Dog german = new Dog("Rover2"); 

     System.out.println("German: " + german + "\tRover: " + rover); 
     System.out.println(german.equals(rover)); 


    } 

両方のオブジェクトが@ Dog0であっても、printステートメントはfalseを出力しています。 疑問に思うなぜ コンソール:彼らは「同じ」ではありません

German: [email protected] Rover: [email protected] 
false 

答えて

1

あなたは間違っていると、それが動作しない理由ですthis == obj比較ため、「エイリアス」としてequalsを使用しています。

this == objは、実際には非常に同じオブジェクト(メモリ内の同じ参照)である場合にのみtrueを返すため、オブジェクトはequalsメソッドを持ちます。

equalsメソッドのプロパティを手動で比較し、一致する場合にのみtrueを返します。

+0

オブジェクトを扱うとき、それは真実を返すためにハッシュコードではなくメモリアドレスを調べますか? – Bishop

+0

はい、正確です。あなたが同じオブジェクトを「指し示している」かどうかを調べ、ハッシュコードとは何の関係もありません。 – Aenadon

1

理由は、ハッシュコードとは何の関係もありません。 this同じ目的であるtrueのみobj場合返し

this == obj 

それらが等しくない理由は、この条件です。
あなたは2つのオブジェクトを持っているので、それは真実ではありません。

また、ソースコードからもわかるように、equals()を呼び出すと、hashCode()は呼び出されません。 AFAIKのの実装です(とにかくJDKでは)equals()hashCode()となります。

+0

'Object'の' toString() 'がどのように実装されているのかという混乱が生じたのかもしれません。 'getClass()。getName()+ '@' + Integer.toHexString(hashCode())'と ''bject'のデフォルトの' hashCode() '実装はオブジェクトの**内部アドレス**を整数に変換します。この内部アドレスは '=='演算子が使用しているものでもあり、混乱します。 –

+0

これはあなたの答えに追加する価値があります:equals()とhashCode()は契約によって結ばれています:o1.equals(o2)がtrueを返した場合、o1.hashCode()== o2.hashCodeも真でなければなりません。反対の場合は必ずしも真ではありません.2つのオブジェクトは同じハッシュコードを持つことができますが、等しくてもfalseを返すことがあります(つまり非常に大きな文字列で)。 – Heri

関連する問題