読者です 読者をやめる 読者になる 読者になる

A Clockwork …

~雑記メモ~

==とequalの区別

Javaをはじめて一番目に引っかかったこと。

==とequalの違い。

そもそも演算子メソッドの違いが挙げられますが、ただそれだけの違いだけではなく、使い方にも違いがあります。

まずは、”==”を理解するために、 以下の2つの例を見てみます。


int s1 = 5;
int s2 = 5;
System.out.println(s1 == s2);

 

Integer s3 = new Integer(5);
Integer s4 = new Integer(5);
System.out.println(s3 == s4);

それぞれ実行した結果が以下のようになります。

 

true
false

 

同じ、値5を比較しただけなのですが、結果が異なっています。

では、どうしてこうなってしまったのでしょうか。

理由としては、intとIntegerの違いが原因として挙げられます。

「端的に言えば、intはプリミティブ型、Integerはint型のラッパークラスでありオブジェクトになります。」

 

プリミティブ型は、オブジェクト指向の中でも基本的な要素を表すための型になります。

具体的に説明すると、

int s = 5;

は、「sは5だ」といううことを示しています。ここでのsは変数です。

あたりまえだと思うかもしれませんが、次のIntegerの説明を見てください。

int型のラッパークラスであるIntegerは、オブジェクトであると言いました。つまり、

Integer s =  new Integer(5);

と書くことによって、このsはオブジェクトになります。

intと同様に言葉で示すと、「sは5という値を保持したあるオブジェクトだ」ということを示しています。

 

 

ここで本題に戻ります。

 

では、頭に示した”==”の例はどういう意味になるのでしょうか。

int s1 = 5;
int s2 = 5;
System.out.println(s1 == s2);

 

s1==s2は「s1とs2は等しいか」という意味です。

ここで、上の説明を振り返ってみると、それぞれ「s1は5だ」「s2は5だ」でした。

よってそのまま言葉を代入してみると、

「5と5は等しいか」

となり、値の比較です。結果、ここでの評価は

true

となることがわかります。

 

では、もう一つの例はどうなるでしょうか。

Integer s3 = new Integer(5);
Integer s4 = new Integer(5);
System.out.println(s3 == s4);

 

s3==s4は「s3とs4は等しいか」という意味です。

同様に考えると、「s3は5という値を保持したあるオブジェクトだ」「s4は5という値を保持したあるオブジェクトだ」となります。

そのまま言葉を代入してみると、

「5という値を保持したあるオブジェクトと5という値を保持したあるオブジェクトは等しいか」となります。

5という値を持っているオブジェクトという意味では等しいように思えるかもしれませんが、よく考えてください。

ここでの比較は上の例とは異なり、オブジェクトの比較になっています。

つまりあるオブジェクトとあるオブジェクトが等しいか?という比較です。

わかりやすく言葉を具体的なものに変えてみます。

 

オブジェクト→車

値5→タイヤ

 

比較分は次のようになります。

「タイヤを保持したある車とタイヤを保持したある車は等しいか」

 

わかりますか?ここで、ある車とある車は等しいと言えるでしょうか?

いえ、別物ですよね?たまたま偶然同一の車を示すこともありますが、基本的に別物であると考えられます。

よって、「5という値を保持したあるオブジェクトと5という値を保持したあるオブジェクトは等しいか」という比較結果は、

false

となります。

 

割と長くなってしまったので、次回に”equal”を回したいと思います。