Javaでは「==」演算子が利用出来ることもあり、初心者プログラマーの方や他のプログラミング言語をメインに利用している方には「equals」メソッドとの区別がいまいち理解出来ていない方もいらっしゃるかと思います。
しかし、「==」演算子と「equals」メソッドの違いを理解せず実装を進めていると思わぬバグを作り出してしまう原因となり得ます。
そこで本記事では、「equals」メソッドの基本的な使い方と「==」演算子との違いについて、サンプルコードで確認しながらご紹介していきたいと思います。
Javaのequalsメソッドとは
JavaのStringクラスより提供されている「equals」メソッドは文字列を比較するために利用されます。
比較対象の文字列が同じ場合は「True」が返却され、異なる場合は「False」が返却されます。
「同一」と「同値」のはっきりとした区別がJavaのequalsメソッドでは行われる
equalsメソッドで良く見かける説明として2つの文字列が「同じ」であるという内容が挙げられます。
この表現がJavaのequalsメソッドを利用する上で、初心者が混乱してしまう原因の1つとなっています。
Javaでは一見「同じ」文字列でも「同一」の文字列と「同値」の文字列で比較結果が異なります。
Javaにおける「同一」とはインスタンスが同じことを意味しており、つまり「参照先が同じ」ことを指します。
「同値」についてはインスタンスが異なる場合でも文字列が同じ場合、「同値」の値と判断されます。
equalsメソッドでもObject型とString型の2通りが存在する
JavaでequalsメソッドというとまずStringクラスより提供されているメソッドをイメージする方が多いかと思います。
Stringクラスのequalsメソッドは頻繁に起こるエラーの原因として、「null」との比較を行なった際にnullPointerExceptionが発生する問題があります。
そこでJavaではjava.util.Objectsクラスにもequalsメソッドを追加し、Objectsクラスのequalsメソッドを利用することでnullPointerExceptionを回避出来る手段が追加されました。
Java equalsメソッドの基本的な使い方
まず基本となるStringクラスでのequalsメソッドの記述方法についてご紹介していきます。
Stringクラスequalメソッドの基本構文
string1.equals(string2)
上記のコードが最も基本的なequalsメソッドの利用方法となります。
string1に該当する文字列とstring2に該当する文字列を比較した結果を返却します。
実際のコードで確認してみよう。
ではequlsメソッドを利用した実際のコードで実行結果を確認していきたいと思います。
まず通常の文字列比較を行なってみます。
import java.util.*; public class Main { public static void main(String[] args) throws Exception { String str1 = "あいうえお"; String str2 = "あいうえお"; System.out.println(str1.equals(str2)); } }
最も基本となるパターンで結果は「true」が返却されます。
true
ここでstr1を「null」として指定して実行してみましょう。
import java.util.*; public class Main { public static void main(String[] args) throws Exception { String str1 = null; String str2 = "あいうえお"; System.out.println(str1.equals(str2)); } }
Stringクラスのequalsメソッドでは比較元の文字列に「null」を指定した場合NullPointerExceptionが発生してしまいます。
Exception in thread "main" java.lang.NullPointerException
at Main.main(Main.java:8)
NullPointerExceptionを避けてequalsメソッドを利用したい場合には上記でご紹介したように、Objectsメソッドのequalsメソッドで下記のように記述することが可能です。
import java.util.*; public class Main { public static void main(String[] args) throws Exception { String str1 = null; String str2 = "あいうえお"; System.out.println(Objects.equals(str1, str2)); } }
Objectsクラスのequalsメソッドを使用した場合の結果は「false」が返却され、NullPointerExceptionを回避出来ていることが確認出来ます。
false
Javaにおけるequalsメソッドと「==」演算子の違いを理解しよう
様々なプログラミング言語で比較の際に利用される演算子といえば「==」ですが、Javaにおいてequalsメソッドとどういった点が異なるのか確認していきたいと思います。
「==」演算子で比較されるのは「同一」の値
同じ文字列をStringクラスのオブジェクトとしてインスタンス化し、「==」演算子で比較した結果を検証してみます。
import java.util.*; public class Main { public static void main(String[] args) throws Exception { String str1 = new String("123"); String str2 = new String("123"); System.out.println(str1 == str2); } }
一見すると同じ「123」という値が設定されているため、答えは「true」となりそうですが結果は下記の通りとなります。
false
この結果は「==」演算子が比較しているのが「同一」の値であり「同値」の値ではない点にあります。
equalsメソッドでは「同値」の値が比較されるため結果が異なる
import java.util.*; public class Main { public static void main(String[] args) throws Exception { String str1 = new String("123"); String str2 = new String("123"); System.out.println(str1.equals(str2)); } }
上記のサンプルコードを比較部分のみequalsメソッドに変更した結果が下記となります。
ture
equalsメソッドではインスタンスの同一ではなく、設定された値の「123」が比較されるため結果は「true」が返却されています。
さいごに
本記事では、Javaのequalsメソッドについて基本的な概念と使い方をご紹介してきました。
Java以外のプログラミング言語を中心に活動されているプログラマーの方が特に起こしやすいミスが、今回ご紹介した「equlsメソッド」と「==」演算子の使い分けとなっています。
ぜひ本記事の情報を記憶に留めて頂き、Javaでコードを実装する際に思わぬバグを生まないよう注意しておきましょう。
これだけの説明だと簡単なのですが、Javaで「equals」メソッドを利用する場合、もう少し深いところまで理解しておく必要があります。