2020.10.29

2つ文字列が等しいかを判定

はじめに

ここでは、与えられた2つの文字列が同じかどうかを判定する方法を説明します。

具体的には、2つのStringクラスのaとbの値が同じかを判定する方法です。

	// aとbは同じ文字列か?
	String a = "abcdef";
	String b = "abcdef";

2つの整数が等しいかを判定する方法

int型short型などの整数値が同じかどうかの判定には、関係演算子'=='を使います。

	int a = 10;
	int b = 10;

	// aとbを'=='で比較
	if ( a == b )
		System.out.println( "aとbは等しい!" );

2つの文字列が等しいかを判定する方法

2つの文字列が同じかどうかを判定する場合は、Stringクラスequalsメソッドを使います。

関係演算子'=='を使ってはいけません。

	// aとbは同じ文字列か?
	String a = "abcdef";
	String b = "abcdef";

	// aとbをequalsメソッドで比較
	if ( a.equals( b ) )
		System.out.println( "aとbは等しい!" );

equalsソッド

boolean equals( Object obj )
・文字列を比較します。

  パラメータ obj : 比較する文字列。

  戻り値     一致した場合true、不一致の場合false

以下のソースコード文字列比較の間違った例です。文字列の比較に'=='を使っています。

	// 間違った例なので使用しないでください

	// aとbは同じ文字列か?
	String a = "abcdef";
	String b = "abcdef";

	// aとbを'=='
	if ( a == b )
		System.out.println( "aとbは等しい!" );

関係演算子'=='を使って文字列の値を比較しようとしてもコンパイルには成功します。また、この例の場合はaとbは等しいと判定されます。

これは、文字列の値の比較ではなく文字列が格納されている場所(参照アドレス)が同じであるかを比較する書き方です。文字列のようにデータのサイズが一定でないものは、データ本体(この場合はString)はメモリのどこかに格納され、その格納した場所(参照アドレス)をクラスが持っています。つまり、クラス変数はデータの場所(参照アドレス)を数値で持っている変数といえます。

上の例で、aとbが同じと判定される理由は、文字列"abcdef"がメモリのどこかに格納され、そのアドレスがaに格納されます。実行時に同じ文字列メモリに複数登録しないようになっているので、bもaと同じ文字列の格納アドレスになるためです。

このように、演算子'=='を使って文字列の値の比較をすることはできません。条件によって一致することはありますが、それは文字列の値が一致しているのではありません。参照アドレスが一致しているのです。

Javaソースコード

以下は、文字列の比較にequalsメソッドを使ったJavaソースコードです。

StringEquals1.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
public class StringEquals1 {
	public static void main(String[] args) {
		// Stringクラスに値を代入
		String a = "abcdef";
		String b = "abcdef";

		// aとbを比較
		if ( a.equals( b ) )
			System.out.println( "aとbは等しい!" );
		else
			System.out.println( "aとbは等しくない!" );

		// aに'g'を足してcに代入し、dにbを代入
		String c = a + "g";	// c="abcdefg"
		String d = b;		// d="abcdef"

		// cとdを比較
		if ( c.equals( d ) )
			System.out.println( "cとdは等しい!" );
		else
			System.out.println( "cとdは等しくない!" );

		// eにcを代入し、dに'g'を足してfに代入
		String e = c;		// e="abcdefg"
		String f = d + 'g';	// f="abcdefg"

		// eとfを比較
		if ( e.equals( f ) )
			System.out.println( "eとfは等しい!" );
		else
			System.out.println( "eとfは等しくない!" );
	}
}

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis StringEquals1.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac StringEquals1.java

実行

C:\talavax\javasample>java StringEquals1

実行結果

aとbは等しい!
cとdは等しくない!
eとfは等しい!

それでは、ソースを順番に観ていきましょう。

003
004
005
006
007
008
009
010
011
		// Stringクラスに値を代入
		String a = "abcdef";
		String b = "abcdef";

		// aとbを比較
		if ( a.equals( b ) )
			System.out.println( "aとbは等しい!" );
		else
			System.out.println( "aとbは等しくない!" );

aとbの値の両方が"abcdef"なので、a.eauals( b )はtrueを戻します。b.eauals( a )でも同じ結果になります。

013
014
015
016
017
018
019
020
021
		// aに'g'を足してcに代入し、dにbを代入
		String c = a + "g";	// c="abcdefg"
		String d = b;		// d="abcdef"

		// cとdを比較
		if ( c.equals( d ) )
			System.out.println( "cとdは等しい!" );
		else
			System.out.println( "cとdは等しくない!" );

cはaに'g'を加えた文字列"acbdefg"になります。dはbと同じ"acbdef"です。よって、c.eauals( d )はfalseを戻します。

023
024
025
026
027
028
029
030
031
		// eにcを代入し、dに'g'を足してfに代入
		String e = c;		// e="abcdefg"
		String f = d + 'g';	// f="abcdefg"

		// eとfを比較
		if ( e.equals( f ) )
			System.out.println( "eとfは等しい!" );
		else
			System.out.println( "eとfは等しくない!" );

eはcと同じ"acbdefg"です。fはdに'g'を加えた文字列"acbdefg"になります。eとfは同じ文字列になるのでe.eauals( f )はtrueを戻します。

以下は、文字列の比較にequalsメソッドを使わずに演算子'=='を使ったJavaソースコードです。間違った例なので、学習以外の目的では使用しないでください、

StringEquals2.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
// このソースは、文字列の比較方法を間違えている例です。

public class StringEquals2 {
	public static void main(String[] args) {
		// Stringクラスに値を代入
		String a = "abcdef";
		String b = "abcdef";

		// aとbを比較(間違った方法)
		if ( a == b )
			System.out.println( "aとbは等しい!" );
		else
			System.out.println( "aとbは等しくない!" );

		// aに'g'を足してcに代入し、dにbを代入
		String c = a + "g";	// c="abcdefg"
		String d = b;		// d="abcdef"

		// cとdを比較(間違った方法)
		if ( c == d )
			System.out.println( "cとdは等しい!" );
		else
			System.out.println( "cとdは等しくない!" );

		// eにcを代入し、dに'g'を足してfに代入
		String e = c;		// e="abcdefg"
		String f = d + 'g';	// f="abcdefg"

		// eとfを比較(間違った方法)
		if ( e == f )
			System.out.println( "eとfは等しい!" );
		else
			System.out.println( "eとfは等しくない!" );
	}
}

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis StringEquals2.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac StringEquals2.java

実行

C:\talavax\javasample>java StringEquals2

実行結果

aとbは等しい!
cとdは等しくない!
eとfは等しくない!

eとfを比較するときにe='abcdefg"、f='abcdefg"と同じ値になっているので「eとfは等しい!」と出力されるのが正しい結果です。この例では、比較を演算子で行っているため正しい結果が得られていません。

それでは、ソースを順番に観ていきましょう。

005
006
007
008
009
010
011
012
013
		// Stringクラスに値を代入
		String a = "abcdef";
		String b = "abcdef";

		// aとbを比較(間違った方法)
		if ( a == b )
			System.out.println( "aとbは等しい!" );
		else
			System.out.println( "aとbは等しくない!" );

aとbの値の両方が"abcdef"なので、aとbの文字列を格納している場所(参照アドレス)が同じになっています。よって( a == b )はtrueを戻します。

015
016
017
018
019
020
021
022
023
		// aに'g'を足してcに代入し、dにbを代入
		String c = a + "g";	// c="abcdefg"
		String d = b;		// d="abcdef"

		// cとdを比較(間違った方法)
		if ( c == d )
			System.out.println( "cとdは等しい!" );
		else
			System.out.println( "cとdは等しくない!" );

cはaに'g'を加えた文字列"acbdefg"になります。dはbと同じ"acbdef"です。文字列を加える処理で参照アドレスが変わったため( c == d )はfalseを戻します。

025
026
027
028
029
030
031
032
033
		// eにcを代入し、dに'g'を足してfに代入
		String e = c;		// e="abcdefg"
		String f = d + 'g';	// f="abcdefg"

		// eとfを比較(間違った方法)
		if ( e == f )
			System.out.println( "eとfは等しい!" );
		else
			System.out.println( "eとfは等しくない!" );

eはcと同じ"acbdefg"です。fはdに'g'を加えた文字列"acbdefg"になります。eとfは同じ文字列ですが、参照アドレスが違うため( e == f )はfalseを戻します。

以上です。

関連コンテンツ

StringクラスとStringBuilderクラスを利用したプログラミングの仕方を紹介しています。

2016.12.16

数値しか扱えないコンピュータでどうやって文字を記憶、処理しているのかを説明しています。興味のある方は、記事をご覧ください。

2020.03.23

世界中のバラバラな文字コードを統一するも目的で作られたUnicode(ユニコード)。数値と文字コードの対応表を参考にしてください。

2020.03.23

Javaのmainメソッドで受け取るパラメータについて解説しています。

2017.09.26

mainメソッドで受け取るパラメータの数の取得の仕方について解説しています。

2019.05.14

条件式を判断して処理を分岐する方法を詳しく説明しています。

2023.03.20

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

プログラムの最初に実行されるメソッドは?

2022.12.13

プログラミングで使う変数って何?

2020.03.23

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「Javaソースコード」から実行可能な「オブジェクトコード」に変換する方法をくわしく説明しています。

2020.03.23

Javaのプログラムを作ってみませんか?プログラミングに必要なものの用意から実行までを説明しています。

2020.03.23

Javaの学習に役立つソースコードを多数紹介しています。是非、ご覧ください。

2022.09.10

Swingパッケージを使ってグラフィック表示を行う方法を解説しています。

2020.03.23

画像フォーマット形式・色・大きさ・傾きなどの変更、特定の図形(文字・記号など)を見つけたり、取り出したりする画像処理について詳しく解説。

2015.11.29

繰り返し処理を使ったJavaのソースコードサンプルを紹介しています。

2020.03.23

配列を使うJavaソースコードを多数紹介しています。

2021.05.18

数学に関係するJavaのメソッドやソースコードなどを紹介しています。

2022.10.25

三角形、台形、円などいろいろな図形の面積を計算するプログラムを紹介しています。詳しくは、記事をご覧ください。

2021.05.18

Javaを使った簡単な応用プログラム(生年月日から年齢を計算プログラムなど)を紹介しています。

2022.07.07

プログラミング、ITに関する用語をまとめています。

2022.10.17

日本で使われてきた伝統文様「和柄」について解説しています。

2022.07.27

自然数と整数って何が違う?

2020.03.23

Javaプログラムの構成について解説しています。詳しくは、こちらをご覧ください。

2020.03.23

コンピュータは、いくつかの装置から構成されています。その主な5つの装置(機能)って何?

2022.07.10

プログラミング言語とは?種類や特徴について説明しています。

2022.08.03

「ゆるゆるプログラム」のコンテンツを紹介しています。興味のある方はこの記事をご覧ください。

2020.03.23

広告