JAvaにおける「==」,equals,hashCodeの違い


      ,            !!!

1.「==」演算子は、2つの変数の値が等しいかどうかを比較するために使用されます.すなわち、比較変数に対応するメモリに格納されている値が同じかどうかは、2つの基本タイプのデータまたは2つの参照タイプの変数が等しいかどうかを比較するには「==」でしか比較できません.変数が基本データ型の場合は、"=="で直接比較できます.例:
String s = "hello";
String t = "hello";
s==t;

戻ってくるのはtrueです.
変数がデータを指すオブジェクト(参照タイプ)である場合、オブジェクト自体がメモリ領域(スタックメモリ)を占有し、変数もメモリを占有する2つのメモリに関連します.次のようになります.
String s = new String("hello");

変数sは1つの記憶空間を占有し、new String("hello")は別の記憶空間に格納される.このとき、変数sの値はnew String("hello")がメモリを占有するヘッダアドレスである.例:
 String s = new String("hello");
 String t = new String("hello");
 s==t;

falseを返します.
2.equalsはObjectクラスが提供するメソッドの1つです.各JavaクラスはObjectクラスから継承されるため、各オブジェクトにはequalsというメソッドがあります.Objectクラスで定義されているequals(Object)メソッドは、"=="演算子を直接使用して2つのオブジェクトを比較するので、equals(Object)メソッドを上書きしていない場合は、equals(Object)と"=="と同様に参照されます.
「==」演算子と比較して、equals(Object)メソッドの特殊な点は、上書き可能であるため、比較参照ではなく上書き方法でデータ内容を比較させることです.Stringクラスがequals(Object)メソッドを上書きしている場合(StringBufferのequalsメソッドはObjectを上書きするメソッドがない)、Stringクラスのequals()メソッドは、2つの独立したオブジェクトの内容が同じかどうかを比較するために使用されます.例:
String s = new String("hello");
String t = new String("hello");
s==t;//s.equals(t);

falseが返され、s.equals(t)がtrueが返されます.したがって、2つのインスタンスオブジェクトの内容が同じかどうかを比較するには、equals()メソッドを上書きしてから比較する必要があります.
3.hashCode()メソッドはObjectクラスから継承され、2つのオブジェクトが等しいかどうかを確認するためにも使用されます.ObjectクラスのhashCode()メソッドは、オブジェクトがメモリ内のアドレスに変換されたint値であることを返すので、hashCode()メソッドを書き換えなければ、どのオブジェクトのhashCode()メソッドも等しくありません.hashCode()も2つのオブジェクトが等しいかどうかを同定するために使用される以上、equals()メソッドとはどのような違いがありますか?一般的にequals()メソッドはユーザに呼び出され、2つのオブジェクトが等しいかどうかを判断したい場合はequals()メソッドを書き換え、コードで呼び出すことで、等しいかどうかを判断することができます.簡単に言えばequals()法は,主に表面的または内容的に2つのオブジェクトが等しいか否かを判断するために用いられる.例えば、学生クラスがあり、属性は名前と性別しかないので、名前と性別が等しい限り、この2つの対象は等しいと考えることができます.一方,hashCode()メソッドは一般にユーザが呼び出すことはなく,例えばhashmapではkeyが繰り返すことができないため,keyが繰り返すか否かを判断する際にhashCode()というメソッドを判断し,equals()メソッドも用いられる.ここで繰り返してはいけませんequals()とhashCode()は1つだけ待たなければいいということです!だから簡単に言えば、hashCode()は1つのオブジェクトの符号化に相当し、ファイルの中のmd 5のように、equals()とは異なり、int型を返しているので、比較的直感的ではありません.一般的にequals()を上書きしながらhashCode()を上書きします.そうしないと、Object.hashCodeの共通の規則に違反し、ハッシュ値(hash)に基づくすべての集合クラス(HashMap、HashSet、Hashtable)と組み合わせて正常に動作しません.hashCode()メソッドの戻り値とequals()メソッドの関係:
x.equals(y)
      true2           hashCode()              
      false,  x y hashCode()           ,       。
      ,hashCode()        ,equals()          。hashCode()       ,equals()         ,      。