JAvaにおけるequalsと==の違い

1387 ワード

==オペレータは、2つの変数の値が等しいかどうか、すなわち、変数が対応するメモリに格納されている値が同じかどうかを比較するために使用されます.2つの基本タイプのデータまたは2つの参照変数が等しいかどうかを比較するには、==オペレータのみを使用します.1つの変数が指すデータがオブジェクトタイプである場合、オブジェクト自体が1つのメモリ(スタックメモリ)を占有し、変数も1つのメモリを占有する2つのメモリに関連します.たとえば、次のようにします.
Objet obj = new Object();

 
変数objはメモリであり、new Object()は別のメモリである.この場合、変数objに対応するメモリに格納される数値は、オブジェクトが占有するメモリのヘッダアドレスである.オブジェクトタイプを指す変数について、2つの変数が同じオブジェクトを指すかどうかを比較する場合、すなわち、2つの変数に対応するメモリの数値が等しいかどうかを確認するには、==オペレータで比較する必要があります.
ただし、次の場合は、
String a=new String("foo");   
String b=new String("foo");  

 2つのnew文は、2つのオブジェクトを作成し、a,bの2つの変数でそれぞれ1つのオブジェクトを指します.これは2つの異なるオブジェクトであり、それらのヘッダアドレスは異なります.すなわち、aとbに格納されている数値は異なるので、式a=bはfalseを返します.この2つのオブジェクトの内容は同じです.一般的には、対象の内容が同じかどうかを比較する必要がありますが、この場合==では実現できません.では、どうすればいいのでしょうか.2つのオブジェクトの内容を1つずつ取り出して比較することができ、同じであれば真を返し、そうでなければ偽を返すことができます.equals法はこのように実現される. 
JAVAにおけるObjectクラスのequalsメソッドの実装コードは以下の通りである.
boolean equals(Object o){   
return this==o;   
} 

 クラスがequalsメソッドを書き直さない場合、==効果と同じであることがわかります.したがって、クラスの場合、オブジェクトが同じかどうかを比較する必要がある場合は、equalsメソッドを書き換える必要があります.文字列はオブジェクトではないかと聞かれるかもしれませんが、なぜ私はequalsを直接使用して書き直さないことができますか?それはJAVAが文字列のequalsメソッドを書き換えたからです.StringとかMathとかIntegerとかDoubleとか...これらのパッケージクラスはequals()メソッドを使用する場合,objectクラスのequals()メソッドを上書きしている.