A Clockwork …

~雑記メモ~

==とequalの区別(ぱーと2)

前回のつづきです。

 

==とequalの違い。

前回は、==の説明をしました。

==では、プリミティブ型で定義した場合と、オブジェクトで定義した場合では比較対象が異なることを示しました。

 

今回はequalです。

 

では、次の例を見てみます。

 


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


Integer s5 = new Integer(5);
Integer s6 = new Integer(5);
System.out.println(s5.equals(s6));

 

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

 

false

true

 

上の3行は前回と同じです。

下の3行はequalを用いました。

これも、同じような比較なはずですが結果が異なっています。

どうしてこうなるのか、解説をします。

 

equalはIntegerクラスのメソッドです。

ここで

s5.equals(s6)

と書くことで、「s5とs6の価値は等しいか」という意味です。

私の場合は、equalの場合、”価値は等しいか”と考えています。

ここで==とは違い、”価値”という表現にしていることに注目してください。

 

s5の中身は何なのかを考えた場合、Int型の5であることがいえます。

また、s6の中身は、同じくInt型の5です。

”価値”を考えた場合、「s5とs6の価値は等しいか」の答えを考えてみると、正しいと言えるため、ここでは結果、

true

と評価されます。

 

これを踏まえると、次の例はどうなるでしょうか。

 

Integer s7 = new Integer(5);

Float s8 = new Float(5f);
System.out.println(s7.equals(s8));

 

日本語にすると、

「s7とs8の価値は等しいか」

となります。

 

わかりましたか?答えは、

false

です。

s7はInt型の5に対して、s8はfloat型の5です。

型が違うため、同じ5であっても値としての”価値”は異なる評価となります。

 

ここで、前回の==の例も確認してみましょう。

次の例はどうなるでしょうか。

 

int s9 = 5;
float s0 = 5.0f;
System.out.println(s9 == s0);

 

難しいですね。答えは、

true

です。

前回の解説を思い出してください。

s9==s0は「s9とs0は等しいか」という意味になります。

s9は5、s0は5.0fですが、数学的にはこの5と5.0fは等しいと言えます。

よって、ここでの評価は正しいとなります。

 

2回にわたって、==とequalの違いに関して説明してみました。

特にString型で効いてくる違いなため、次回は補足回として説明したいと思います。