Javaプログラミング学習サイト ゆるゆるプログラミング

2020/03/23 公開

・文字列が等しいか判定

ここでは、与えられた2つの文字列が同じかどうかを判定する方法を説明します。具体的には、2つのStringクラスのaとbの値が同じかを判定する方法です。

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

int型short型などの整数値が同じかどうかを判定するときは、関係演算子'=='を使って判定します。

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

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は等しいと判定されます。

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

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

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

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

StringEquals1.java ← クリックしてダウンロードページに移動
001:    public class StringEquals1 {
002:    	public static void main(String[] args) {
003:    		// Stringクラスに値を代入
004:    		String a = "abcdef";
005:    		String b = "abcdef";
006:    
007:    		// aとbを比較
008:    		if ( a.equals( b ) )
009:    			System.out.println( "aとbは等しい!" );
010:    		else
011:    			System.out.println( "aとbは等しくない!" );
012:    
013:    		// aに'g'を足してcに代入し、dにbを代入
014:    		String c = a + "g";	// c="abcdefg"
015:    		String d = b;		// d="abcdef"
016:    
017:    		// cとdを比較
018:    		if ( c.equals( d ) )
019:    			System.out.println( "cとdは等しい!" );
020:    		else
021:    			System.out.println( "cとdは等しくない!" );
022:    
023:    		// eにcを代入し、dに'g'を足してfに代入
024:    		String e = c;		// e="abcdefg"
025:    		String f = d + 'g';	// f="abcdefg"
026:    
027:    		// eとfを比較
028:    		if ( e.equals( f ) )
029:    			System.out.println( "eとfは等しい!" );
030:    		else
031:    			System.out.println( "eとfは等しくない!" );
032:    	}
033:    }

StringEquals1.javaの出力結果

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

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

003:    		// Stringクラスに値を代入
004:    		String a = "abcdef";
005:    		String b = "abcdef";
006:    
007:    		// aとbを比較
008:    		if ( a.equals( b ) )
009:    			System.out.println( "aとbは等しい!" );
010:    		else
011:    			System.out.println( "aとbは等しくない!" );

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

013:    		// aに'g'を足してcに代入し、dにbを代入
014:    		String c = a + "g";	// c="abcdefg"
015:    		String d = b;		// d="abcdef"
016:    
017:    		// cとdを比較
018:    		if ( c.equals( d ) )
019:    			System.out.println( "cとdは等しい!" );
020:    		else
021:    			System.out.println( "cとdは等しくない!" );

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

023:    		// eにcを代入し、dに'g'を足してfに代入
024:    		String e = c;		// e="abcdefg"
025:    		String f = d + 'g';	// f="abcdefg"
026:    
027:    		// eとfを比較
028:    		if ( e.equals( f ) )
029:    			System.out.println( "eとfは等しい!" );
030:    		else
031:    			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:    public class StringEquals2 {
004:    	public static void main(String[] args) {
005:    		// Stringクラスに値を代入
006:    		String a = "abcdef";
007:    		String b = "abcdef";
008:    
009:    		// aとbを比較(間違った方法)
010:    		if ( a == b )
011:    			System.out.println( "aとbは等しい!" );
012:    		else
013:    			System.out.println( "aとbは等しくない!" );
014:    
015:    		// aに'g'を足してcに代入し、dにbを代入
016:    		String c = a + "g";	// c="abcdefg"
017:    		String d = b;		// d="abcdef"
018:    
019:    		// cとdを比較(間違った方法)
020:    		if ( c == d )
021:    			System.out.println( "cとdは等しい!" );
022:    		else
023:    			System.out.println( "cとdは等しくない!" );
024:    
025:    		// eにcを代入し、dに'g'を足してfに代入
026:    		String e = c;		// e="abcdefg"
027:    		String f = d + 'g';	// f="abcdefg"
028:    
029:    		// eとfを比較(間違った方法)
030:    		if ( e == f )
031:    			System.out.println( "eとfは等しい!" );
032:    		else
033:    			System.out.println( "eとfは等しくない!" );
034:    	}
035:    }

StringEquals2.javaの出力結果

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

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

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

005:    		// Stringクラスに値を代入
006:    		String a = "abcdef";
007:    		String b = "abcdef";
008:    
009:    		// aとbを比較(間違った方法)
010:    		if ( a == b )
011:    			System.out.println( "aとbは等しい!" );
012:    		else
013:    			System.out.println( "aとbは等しくない!" );

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

015:    		// aに'g'を足してcに代入し、dにbを代入
016:    		String c = a + "g";	// c="abcdefg"
017:    		String d = b;		// d="abcdef"
018:    
019:    		// cとdを比較(間違った方法)
020:    		if ( c == d )
021:    			System.out.println( "cとdは等しい!" );
022:    		else
023:    			System.out.println( "cとdは等しくない!" );

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

025:    		// eにcを代入し、dに'g'を足してfに代入
026:    		String e = c;		// e="abcdefg"
027:    		String f = d + 'g';	// f="abcdefg"
028:    
029:    		// eとfを比較(間違った方法)
030:    		if ( e == f )
031:    			System.out.println( "eとfは等しい!" );
032:    		else
033:    			System.out.println( "eとfは等しくない!" );

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

以上です。

■関連コンテンツ

文字列 文字列について
文字コード 文字コードについて
Unicode Unicode(ユニコード)
空文字列かを判定 空文字列かを判定する方法を解説

■新着情報

2022.07.07 外部プログラムの実行 exeファイル実行
2022.07.06 完全数 6=1+2+3

■広告

 

 

 

 

 

スッキリわかるJava入門第3版 [ 中山清喬 ]

価格:2,860円
(2021/6/18 14:32時点)
感想(6件)

 

 

 

 

Topへ