Javaで文字列の比較をする際に==を使用しているという人は多いのではないでしょうか?
確かに問題なく比較をすることができる場合もあるが、もしかしたら自分が思っている結果を出してくれないコードになっている場合もあります。
ではどのようにして文字列を比較するのがいいのかですが、それはequalsメソッドを使用するというものです。
この記事では==とequalsメソッドの違いなどについて解説していきます。
==とequalsの違いについて
では==とequalsメソッドの違いについて解説していきます。
まず==はint型などのプリミティブ型の変数を比較する際に使用します。
プリミティブ型ってなんだという方は下記記事で解説していますので、一度読んでみてください。
Javaのプリミティブ型(データ型)解説【初学者・初心者用】 | エンジニアKISARAGIの備忘録 (kisaragi-it.com)
対してequalsメソッドはString型などの参照型を比較する際に使用するものです。
参照型について知りたいという方は下記記事で解説していますので、一度読んでみてください。
Javaの参照型(データ型)解説【初学者・初心者用】 | エンジニアKISARAGIの備忘録 (kisaragi-it.com)
このような違いがあるため、文字列を比較するとなったらequalsメソッドを使用する方が正しいです。
しかしequalsメソッドを使用しなかったらエラーが出るのかというと、そんなことはありません。
「え?それなら別に==を使ってもそこまで問題じゃなくないか?」
というような疑問を持たれた方もいるのではないでしょうか?
確かにエラーは出ませんが、それよりももっとややこしいことが発生します。
それは下記コードと結果を見ていただいたら分かるかと思います。
【コード】
public class Comparison {
public static void main(String[] args) {
String a="Javaの勉強";
String b=new String("Javaの勉強");
if(a==b) {
System.out.println("等しい値です");
} else {
System.out.println("等しくないです");
}
}
}
【実行結果】
等しくないです
変数aとbに「Javaの勉強」という文字列をそれぞれ代入していますが、結果は「等しくないです」となっています。
この理由として==では文字列が入っている変数のアドレスを比較しているためです。
「変数のアドレス?」
となった方のために簡単に解説すると変数にはそれぞれアドレスという住所のようなものが与えられています。
現実で表現すると、アドレスは住所で変数名というのは〇〇さんの家というようイメージです。
そのため同じ田中という苗字の人でも家が同じということはありませんよね?
それと同じで同じ文字列だからと言ってお暗示アドレスということはないのです。
このようにして==を使用することで文字列の比較を行っています。
ではequalsメソッドはどうかというと、これの場合はアドレスの比較ではなく変数名の比較を実施しています。
【コード】
public class Comparison {
public static void main(String[] args) {
String a="Javaの勉強";
String b=new String("Javaの勉強");
if(a==b) {
System.out.println("等しい値です");
} else {
System.out.println("等しくないです");
}
if(a.equals(b)) {
System.out.println("equalsの比較では等しい値です");
} else {
System.out.println("equalsの比較では等しくないです");
}
}
}
【実行結果】
等しくないです
equalsの比較では等しい値です
先ほどのコードにequalsメソッドでの比較をする処理を上記のように追加してみました。
その結果等しいという結果が出ていることが分かります。
このようにして文字列の比較を実施する場合はequalsメソッドを使用することで文字列が同様かどうかを判断することができます。
因みにですが、下記のようにインスタンス化せずにStringだけで文字列を変数に代入した場合は等しいという結果となります。
【コード】
public class Comparison {
public static void main(String[] args) {
String a="Javaの勉強";
String b="Javaの勉強";
if(a==b) {
System.out.println("等しい値です");
} else {
System.out.println("等しくないです");
}
}
}
【実行結果】
等しい値です
その理由としてStringのみで変数を作成すると何度作成してもアドレスは同様のものとなるためです。
equalsメソッド使用時の注意点
では文字列を比較する際に使用するequalsメソッドですが、使用の際に一点注意していただきたいことがございます。
それが変数にnullを使用する場合です。
下記のように変数にnullを入れた結果としてNullPointerExceptionという例外が発生してしまうためです。
【コード】
public class Comparison {
public static void main(String[] args) {
String a="Javaの勉強";
String b=null;
if(b.equals(a)) {
System.out.println("equalsの比較では等しい値です");
} else {
System.out.println("equalsの比較では等しくないです");
}
【実行結果】
Exception in thread "main" java.lang.NullPointerException:
上記では例外は発生してしまっていますが、aの方をnullとしてbの方は通常の文字列を代入した場合ですと例外は発生しません。
そのためequalsメソッドを使用する際の「変数1.equals(変数2)」の変数1にnullを代入した変数が割り当たらないように注意する必要があります。
まとめ
この記事ではJavaの文字列比較方法について解説してきました。
- ==とequalsの違いについて
- equalsメソッド使用時の注意点
単純な文字列の比較だと思っていても実際は正しく比較されないことがあるということが分かっていただけたのではないでしょうか?
私も過去に何度か==を使用して比較を行った結果、目的の結果が全然出力されず困った経験があります。
皆さんも気を付けてコーディングを実施してください。
以上で今回の解説は終了となりまります。
コメント