文字列と文字列を比較する

Java で文字列は参照型のため、同じ文字列を参照しているか比較するには == 演算子を使い、同じ値を持っているかどうか比較するには String クラスの equals メソッドを使用します。ただ文字列の場合は、他の参照型と異なる挙動を示す場合もあり注意が必要です。ここでは Java で文字列と文字列を比較する方法について解説します。

(Last modified: )

文字列と文字列の比較方法

int 型などの基本データ型の場合、値が等しいかどうかは == 演算子を使用します。次のサンプルを見てください。

int num1 = 10;
int num2 = 10;

System.out.println(num1 == num2);  // true

それに対して配列や文字列などの参照型の場合、 == 演算子は同じオブジェクトを参照している場合に true となるため、例えば 2 つの文字列が同じ値であっても、参照している文字列のオブジェクトが異なる場合は false となります。次のサンプルを見てください。

String msg1 = "Hello";
String msg2 = new String(msg1);

System.out.println(msg1 == msg2);  // false

2 つの文字列が同じ文字列オブジェクトを参照している場合は == 演算子は true となります。

String msg1 = "Hello";
String msg2 = msg1;

System.out.println(msg1 == msg2);  // true

参照しているオブジェクトが同じかどうかではなく、例えば 2 つの文字列に格納されている値が等しいかどうかを調べるには、 String クラスで用意されている equals メソッドを使います。

public boolean equals(Object anObject)

パラメータ:
anObject - このStringと比較するオブジェクト

戻り値:
指定されたオブジェクトがこの文字列に等しいStringを表す場合はtrue、それ以外の場合はfalse

このメソッドを実行している文字列と、引数に指定した文字列の値が等しい場合は true を返します。

実際には次のように行います。

String msg1 = "Hello";
String msg2 = new String(msg1);

System.out.println(msg1.equals(msg2));  // true

2 つの文字列が格納している値が同じなので true が返されました。このように文字列と文字列の値を比較する場合には、 String クラスの equals メソッドを使用してください。

サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample4-1.java という名前で保存します。

class JSample4_1{
  public static void main(String[] args){
    String msg1 = "Hello";
    String msg2 = new String(msg1);

    System.out.println(msg1 == msg2); 
    System.out.println(msg1.equals(msg2)); 
  }
}

コンパイルを行います。

javac -encoding UTF-8 JSample4_1.java

その後で、次のように実行してください。

java JSample4_1

文字列と文字列の比較方法(1)

2 つの文字列を == 演算子を使って比較した場合と、 String クラスの equals メソッドを使って比較した場合の結果を出力しました。

文字列リテラルを使って文字列を作成した場合の比較について

参照型のデータの場合、例えば 2 つの変数を同じように初期化したあとで == 演算子を使って比較しても true とはなりません。例えば次のように配列で試してみます。

int[] num1 = {1, 2, 3};
int[] num2 = {1, 2, 3};

System.out.println(num1 == num2);  // false

各要素の値はすべて一致していますが、それぞれの変数が参照しているオブジェクトが異なるため == 演算子で比較しても false となります。

では今度は同じ参照型の文字列で試してみます。

String msg1 = "Hello";
String msg2 = "Hello";

System.out.println(msg1 == msg2);  // true

文字列の場合、同じ文字列リテラルを変数に格納すると、異なるオブジェクトをそれぞれ作成するのではなく同じオブジェクトへの参照を変数に格納するためです。

文字列は不変オブジェクトのため、同じオブジェクトを複数の変数から参照している状態で、いずれかの変数に別の文字列を格納しなおしても他の変数が参照している文字列には影響がありません(詳しくは「String型の変数に別の文字列を代入する」を参照されてください)。その為、同じ文字列を参照していても実用上は何も問題がありません。

だからといって文字列と文字列の値が等しいかどうかを調べるために == 演算子を使用しないでください。 2 つの変数に同じ文字列リテラルを格納した場合は == 演算子でも true となりますが、それ以外の方法で文字列を作成した場合には false となるためです。

char[] c = {'A', 'B', 'C'};
String msg1 = new String(c);
String msg2 = new String(c);

System.out.println(msg1 == msg2);       // false
System.out.println(msg1.equals(msg2));  // true

文字列と文字列の値が等しいかどうかを調べる場合は String クラスの equals を使用されるようにしてください。

-- --

Java で文字列と文字列を比較する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。