ないぱかの記録

ないぱかからあるぱかになれるか

"=="とequalsとコンスタントプール【Java】

Java初心者が一度は持つ疑問、それは…

"=="equalsって何が違うん?!」

最初は違いわからなくてString型の変数を"=="で比較しようとしたり、int型の変数をequalsで比較したりしてしまったものです。


この違いを尋ねられた時にスラスラ〜と説明できるように一度ここで整理しておきます!


まず、簡単に説明すると、

==:同一性を確認する比較演算子
equals:同値性を確認するメソッド

となります。


同一性というのは「参照しているインスタンスが同じかどうか」というものです。 

Sample sample1 = new Sample();
Sample sample2 = new Sample();
Sample sample3 = sample1;

System.out.println(sample1 == sample2); // false
System.out.println(sample1 == sample3); // true

sample1とsample3には同一性がありますが、sample1とsample2には同一性はありません。


同値性は「オブジェクトの中の値が同じかどうか」というものです。
プリミティブ型と言われるint型などはオブジェクトを生成しないので、equalsで比較する事ができません。

String str1 = "ないぱか";
String str2 = "あるぱか";
String str3 = "ない" + "ぱか";

System.out.println(str1.equals(str2)); // false
System.out.println(str1.equals(str3)); // true


ここまで説明すると、String型では同一性の比較ができないんだな〜となるんですが、
実はString型でも場合によっては"=="で比較することも可能です。

例えばこんな例。

String str1 = "A";
String str2 = "A";

System.out.println(str1 == str2); // true

これはコンスタントプールというものが働いているために起こります。

コンスタントプールとは、同じ文字リテラルがプログラム内に再び登場すると、定数用のメモリ空間にある文字列インスタンスへの参照が使い回しされることです。これにより、参照を比較する"=="で値を比較することができるんです。

じゃあStringも”=="で比較したっていいじゃん!と言いたい気持ちはわかるんですが、どんな場合でも"=="で比較ができるというわけではありません。
複雑な処理になるとコンパイルさんが同じ文字リテラルがどうかを判断するのが難しくなって別の参照が作られてしまい、"=="で比較することができなくなります。

なので、Stringの比較にはequalsメソッドを使っておくと覚えておきましょう٩( 'ω' )و

まとめ

参照、値を比較するときには
⇨"=="、
オブジェクト内の値を比較するときは
⇨equalsメソッド