未分類

JavaのequalsメソッドはString型は同値、Object型は同一を判断する

string型のequalsメソッド

Javaでよく使うequalsメソッドは、Javaメソッドの中でも勘違いしやすいメソッドです。

equalsはご存知の通り、同じを意味する英単語なので、Javaのequalsメソッドも大枠では同じを判断するメソッドです。

ですが、厳密には同じという意味は2つの意味を持ちます。

一つは同一、一つは同値です。

この同一と同値の違いを正確に理解しないと、equalsメソッドは理解できないです。

というか、まず仕組みを理解したほうがequalsを圧倒的に深く理解できます。

急がば回れです。

Javaの同一と同値の違い

同一とは、「インスタンスの参照先が同じ」を意味します。

変数は異なっていても、向いているインスタンスは同じです。

例を挙げます。

これはUser型の変数aに”佐藤”をパラメーターで渡すUser型のインスタンス参照先を代入しています。

そして、そのインスタンス参照先のコピーを変数bに代入しています。

この時、aには変わらず佐藤”をパラメーターで渡すUser型のインスタンス参照先が代入されていますが、bにも佐藤”をパラメーターで渡すUser型のインスタンス参照先が代入されています。

同一とはインスタンスの参照先が同じを意味するため、aとbは同じです。

以下はHogeクラスです。
同一は==で判断するので、結果はtrueになります。

一方で、同値とは「持っている値が同じ」を意味します。

インスタンスが異なっていたとしても、保持している値が同じなら、それは同値です。

同値の判断にはequalsを使います。

例を挙げます。

これはString型の変数aとbにそれぞれ”おはよう”をパラメーターで渡すString型のインスタンス参照先を代入しています。

パラメータはaもbも”おはよう”を渡していますが、それぞれnewしているので異なるインスタンス参照先を代入しています。

そのため、同一ではありません。(上の方でやりましたね。)しかし、値は同じなので同値です。

以下はHogeクラスです。

同値はequalsで判断するので、結果はtrueになります。反対に同一判断の==を使えば、falseになります。

String型に定義されているequalsメソッドはこのように同値を判断します。

equalsメソッドはStringクラスにだけ存在するように思われていますが、実はこのequalsメソッドはObjectクラスにも最初から定義されているので、すべてのクラスが持っているメソッドです。(すべてのクラスはObjectクラスを継承しています)

StringクラスはこのObjectクラスのequalsメソッドを同値を判断するようにオーバーライドしているので、同値を判断するメソッドになっているだけです。

Stringクラス生成時のパラメータををchar型に入れて、1文字ずつ取り出して、同じかを判断しています。

仕組みは単純ですね。(詳しくはStringクラスのリファレンスを見てください。)

Objectクラスのequalsメソッドは同一を判断する

ちなみに、Objectクラスに定義されているequalsメソッドは以下です。

インスタンスの参照先を判断していますね。つまり、Object型のequalsメソッドは本来、インスタンス参照先を判断しています

見てわかるようにインスタンス同士を比較しているので、インスタンスの参照先が同じだとtrue、異なればfalseを返すのがObjectクラスのequalsメソッドです。

なので、クラスでequalsメソッドを使う場合、String型以外は同一を判断するので注意が必要です。

同値を判断するためにはequalsメソッドをオーバーライドして、同値を判断するequalsメソッドにしないといけません。

【まとめ】

JavaのequalsメソッドはそもそもObjectクラスに定義されているので、すべてのクラスが持っているメソッドです。

ですが、Objectクラスのequalsメソッドは同一を判断するメソッドのため、そのまま使うとインスタンスの参照先が同じか否かしか判断できません。

じゃあ、なぜStringクラスのequalsメソッドは同値を判断するかというと、StringクラスはObjectクラスのequalsメソッドを同値を判断するメソッドにオーバーライドしているからです。Stringクラスだけなんで同値が判断できるか、疑問に思うかもしれませんが、一言でいうと、Stringクラスはequalsメソッドをオーバーライドしているからです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です