equals()とhashCode()の違い
Equals()、 "=="、およびhashCode()に関する簡単な定義が必要です。次のコードを実行すると、出力は「true false 2420395 2420395」になります。しかし、equals()メソッドは文字列を比較し、「==」は参照を比較することを理解していました。しかし、出力では、hashCcode()メソッドは、両方の文字列の参照番号を同じように出力するので、「==」が「false」を返すのはなぜですか。
String str = "Name";
String str1 = new String("Name");
if(str.equals(str1))
System.out.println("true");
else
System.out.println("false");
if(str==str1)
System.out.println("true");
else
System.out.println("false");
System.out.println(str.hashCode());
System.out.println(str1.hashCode());
}
equals()およびhashCode()メソッドは、これらの2つのメソッドを実装するオブジェクトがコレクションに追加されるときに非常に重要であることがわかります。正しく実装しないと、あなたの人生を台無しにするかもしれません。
equals():このメソッドは、引数として渡された他のオブジェクトが、このメソッドが呼び出されたオブジェクトと等しいかどうかを確認します。規約を理解していない場合、equals()メソッドを誤って実装するのは簡単です。このメソッドをオーバーライドする前に、以下の「プロパティ」を覚えておく必要があります-
- 再帰:o1.equals(o1)-これは、オブジェクト(o1など)がそれ自体と等しいことを意味します
- 対称:o2.equals(o1)の場合のみo1.equals(o2)
- 推移的:o1.equals(o2)&& o2.equals(o3)は、o1.equals(o3)も同様であることを意味します
- 一貫性:o1およびo2が変更されていない限り、o1.equals(o2)は同じ結果を返します
- null比較:!o1.equals(null)-インスタンス化可能なオブジェクトがnullと等しくないことを意味します。したがって、オブジェクトo1の引数としてnullを渡すと、falseが返されます。
- ハッシュコード値:o1.equals(o2)はo1.hashCode()== o2.hashCode()を意味します。これは非常に重要です。 equals()メソッドを定義する場合は、hashCode()メソッドも定義する必要があります。また、2つのオブジェクトが等しい場合、それらは同じhashCodeを持つ必要がありますが、その逆は当てはまりません。
Javaソースコードからから
*
* @param obj the reference object with which to compare.
* @return {@code true} if this object is the same as the obj
* argument; {@code false} otherwise.
* @see #hashCode()
* @see Java.util.HashMap
*/
public boolean equals(Object obj) {
return (this == obj);
}
hashCode():このメソッドは、hashCode()値を整数として返し、Hashtable、HashMap、HashSetなどのハッシュベースのJava.util.Collectionクラスの利点のためにサポートされています。クラスがequals()メソッドでは、hashCode()メソッドも実装する必要があります。このメソッドをオーバーライドする前に、
- Javaプログラムの実行中にhashCode()メソッドが同じオブジェクトで複数回呼び出される場合は常に、このメソッドは常に同じ結果を返す必要があります。整数の結果は、1回の実行で一貫性を保つ必要はありません同じプログラムの次の実行へのプログラムの。
Equals()メソッドに従って2つのオブジェクトが等しい場合、2つのオブジェクトのそれぞれでhashCode()メソッドを呼び出すと、同じ整数の結果が返される必要があります。したがって、フィールドがequals()で使用されていない場合は、hashCode()メソッドで使用しないでください。
Equals()メソッドのように2つのオブジェクトが等しくない場合、2つのオブジェクトはそれぞれ、2つの異なる整数結果または同じ整数結果を返すことができます(つまり、2つのオブジェクトが同じhashCode()結果を持っている場合、それらが等しいとは限りませんが、 2つのオブジェクトが等しい場合、それらは同じhashCode()の結果を返す必要があります)。
Javaソースコードに従って、Java.lang.Objectによって定義されたhashCodeメソッドは、個別のオブジェクトに対して個別の整数を返します(これは通常、オブジェクトの内部アドレスを整数に変換することにより実装されます)
hashCode()
は、オブジェクトの参照を返しませんが、オブジェクトのハッシュを返します。 _==
_は、hashCode()
の値を使用してオブジェクトを比較しませんが、正しく言うと、オブジェクトの参照の値によって比較します。
equals()は文字列を比較するだけで、文字列の参照をチェックしません
しかし、「==」は参照とデータの両方をチェックします
最初のケースでは文字列str = "Name";作成されるオブジェクトは1つだけですが、
2番目のケース2つのオブジェクトが作成されます
String str1 = new String("Name");
参照は両方の文字列で同じではないため、falseを返します
hashCodeのドキュメント を読むことができます。一言で言えば、_(obj1.equals(obj2)
_がtrueである場合、obj1.hashCode()==obj2.hasCode()
はtrueを有効な実装にします。
2つの異なるオブジェクトが同じハッシュコードを共有できないという意味ではないことに注意してください。実際、この例はメソッドの有効な(ただし、ひどい)実装です。
_class MyClass {
public int hashCode() {return 0;}
}
_
.equals()
は、文字列の実際の内容を比較します。
「==」演算子は、2つのオブジェクトがメモリ内で同じ参照かどうかを比較します。 _str = str1;
_を実行すると、二重等号演算子はメモリ内の同じ参照を指すため、true
を返します。
hashCode()
は、オブジェクトのハッシュを任意の方法で返します。メソッドがなんらかの方法でオーバーライドされない限り、返される値は常に一意です。 .equals()
がtrueを返す場合、ハッシュコードは同じである必要があります。
- 他の言ったように「==」は参照を比較します。ただし、この2つのメソッドは、オーバーライドできる何かを実行するだけのメソッドです。
- すべてのメソッドは何かをします。あなたがそれが正確に何をしているか、そしてその意味が何であるかを知りたいなら、あなたはドキュメントを読む必要があります。
- これらのメソッドは、必要に応じてオーバーライドできます。ただし、これらの2つのメソッドはJavaのドキュメントに従う必要があります。これらは他のクラスで使用されているためです。たとえば、
equals()
は、リストと.hashCode()
は、Javaクラスライブラリによって提供されるいくつかのハッシュテーブルクラスで使用されます。
equals()とhashCode()は異なるメソッドであり、2つのオブジェクト参照が同じかどうかを確認するためにhashCodeメソッドを使用しないでください。 理由: hashCodeはオブジェクトのint値を返すだけです。2つの異なるオブジェクトが同じhashCode整数を持つこともできます。 hashCode()によって返される値は、オブジェクトのハッシュコードです。これは、16進数のオブジェクトのメモリアドレスです。 equals()は、2つのオブジェクト参照が同じかどうかを確認します。 2つのオブジェクトが等しい場合、それらのhashCodeは同じでなければなりませんが、その逆は当てはまりません。