Javaコラム Javaエンジニアのためのお役立ちコラム

Javaのequalsの使い方を解説します!|文字列はequalsで比較してみよう

2020年10月14日

SE
Javaでの文字列の比較構文にはどういったものがありますか?

PM
では、代表的な構文から見ていきましょう。

Javaのequalsとは?


JavaのequalsとはObject型のequalsメソッドの事を指しますが、一般的にはそれをオーバーライドしたString型のequalsのことを言う場合がほとんどです。equalsメソッドの機能は2つのオブジェクトを比較して等しいかどうかを判別します。

Javaで2つの比較と言えば最初に習うのは==です。==は数値の比較に使用しますが、文字列などのオブジェクトの比較には、==ではなくequalsを使用しなければなりません。

文字列の比較にはequalsを使用する

以下のJavaサンプルのように、文字列の比較は==ではなくequalsを使うのが正解です。

String str1 = “”あいうえお””;
String str2 = “”あいうえお””;

//正解
if (str1.equals(str2)) System.out.println(“”同じ内容です。””);
//間違い
if (str1==str2) System.out.println(“”同じ内容です。””);

文字列は==ではなくequalsで比較する

文字列の比較に==ではなくequalsを使用する理由は、equalsが文字列の内容の比較を行っているのに対し、==は参照のアドレスの比較を行っているからです。アドレスと言うと難しく感じると思いますが、アドレスとはコンピュータのメモリのデータの格納場所のことです。

文字列の比較に==を使用すると、2つの文字列の内容が同じかどうかの比較ではなく、2つの文字列の格納場所が同じかどうかをチェックしてしまうのです。よって==では正しい比較ができないのです。

==でも正しく判定できる時がある?

ところが、このJavaサンプルを実行すると==で判定している2つ目も「同じ内容です。」と表示されることがあります。なぜなのでしょうか。それはJavaの動作環境が、str1とstr2の文字列が同じ内容であるため、メモリ節約のために内部で1つにまとめてしまうからです。

そのため==で判定しても参照が同じなので、等しい結果になる場合があります。しかしこれはあくまでたまたまそうなっているだけです。文字列の内容比較は必ずequalsで行いましょう。

equalsIgnoreCaseは大文字小文字を無視して判定できる

JavaのString型にはequals以外にequalsIgnoreCaseというメソッドもあります。これは大文字小文字を無視した比較ができます。以下のJavaサンプルをご覧ください。

String str1 = “”abcdefg””;
String str2 = “”aBcDeFg””;

if (str1.equals(str2)) System.out.println(“”同じ内容です。””);
if (str1.equalsIgnoreCase(str2)) System.out.println(“”同じ内容です(大文字小文字無視)。””);

これを実行すると「同じ内容です(大文字小文字無視)。」とだけ表示されます。

比較する文字列がnullだった場合

比較する文字列がnullだった場合はどうなるのでしょうか?

以下のJavaサンプルは空文字とnullを比較しています。

String str1 = “”””;
String str2 = null;

if (!str1.equals(str2)) System.out.println(“”違う内容です。””);

結果は「違う内容です。」と表示されます。if文の比較に!をつけていますが、これで判定が否(false)だった場合にtrueになります。

なおstr1がnullだった場合はNullPointerExceptionが発生します。null参照のequalsメソッドにアクセスしてるからです。

Objectsクラスのequalsメソッド

Objectsというクラスにもequalsというメソッドがあります。これは2つのパラメータの内容比較を行うことが出来ます。なお以下のJavaサンプルを実行する場合はソースの先頭に「import java.util.*;」を記述してください。

String str1 = “”あいうえお””;
String str2 = “”あいうえお””;
String str3 = null;
String str4 = null;

if (Objects.equals(str1, str2)) System.out.println(“”同じ内容です(1つ目)。””);
if (Objects.equals(str3, str4)) System.out.println(“”同じ内容です(2つ目)。””);

Objectsのequalsはnullにも対応できる

上のJavaサンプルを実行すると、以下の結果になります。

同じ内容です(1つ目)。
同じ内容です(2つ目)。

null同士を比較して結果がtrueになっています。このメソッドを使えばNullPointerExceptionの心配がありません。是非活用してください。

次は文字列以外のequalsによる比較について見て行きましょう。

Integer型などのequals

String型以外のequalsメソッドの使い方を説明しましょう。

以下のJavaサンプルをご覧ください。

Integer i1 = Integer.valueOf(3);
Integer i2 = Integer.valueOf(3);
Short s1 = Short.valueOf((short)3);
int int1 = 3;
short short1 = 3;

if (i1.equals(i2)) System.out.println(“”同じ内容です(1つ目)。””);
if (i1.equals(s1)) System.out.println(“”同じ内容です(2つ目)。””);
if (int1==short1) System.out.println(“”型は違っても同じです。””);

Integer型などの仕様はしっかり押さえる

上のJavaサンプルを実行すると、以下の結果になります。

同じ内容です(1つ目)。
型は違っても同じです。

1つ目のif文はInteger型同士を比較して、別のオブジェクトですが中身が3なので同じと判定されています。2つ目は比較したInteger型とShort型は値は同じ3でも、型が違うので同じになりません。しかし、int型とshort型の変数の比較では、どちらも3のため同じになっています。

2つ目と3つ目の結果が違うのは違和感があるかもしれませんが、これがJavaの仕様であると理解しましょう。

Object型のequalsの動作

全てのクラスのベースとなるObjectクラスのequalsはどのような効果があるのでしょうか。以下のJavaサンプルをご覧ください。

Object o1 = new Object();
Object o2 = o1;

if (o1.equals(o2)) System.out.println(“”同じオブジェクトです。””);

結果は「同じオブジェクトです。」と表示されます。Objectクラスのequalsは同じオブジェクトかどうかを判定できます。

equalsを使う時は機能をしっかりチェックする

ただし、ここまで見てきたようにObject型を継承するString型やInteger型などのequalsは、Object型のequalsをオーバーライドして、別のオブジェクトでも値が同じかどうかをチェックするメソッドになっています。Object型を継承したクラスでは、equalsの性質は違っているのです。

よってequalsを使う時は、そのクラスでのequalsがどのような機能を持っているのかをしっかりチェックしてから使用しましょう。

SE
equalsを利用することで文字列を比較できるようになるんですね。

PM
はい。ただ、クラスごとに機能が違うのできちんとチェックしてくださいね。

文字列を比較するときはequalsを使用しよう

Javaのequalsについて解説してきましたが、ご理解頂けましたでしょうか。

一番重要なことは、Javaの文字列の比較は==ではなくequalsを使用するということです。Java以外の言語では==で文字列を比較できる場合もあるので、混乱しないように注意しましょう。


Java分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)