2020.10.29
2つ文字列が等しいかを判定
はじめに
// aとbは同じ文字列か? String a = "abcdef"; String b = "abcdef";
2つの整数が等しいかを判定する方法
int a = 10; int b = 10; // aとbを'=='で比較 if ( a == b ) System.out.println( "aとbは等しい!" );
2つの文字列が等しいかを判定する方法
// 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は等しい!" );
これは、文字列の値の比較ではなく文字列が格納されている場所(参照アドレス)が同じであるかを比較する書き方です。文字列のようにデータのサイズが一定でないものは、データ本体(この場合はString)はメモリのどこかに格納され、その格納した場所(参照アドレス)をクラスが持っています。つまり、クラスの変数はデータの場所(参照アドレス)を数値で持っている変数といえます。
上の例で、aとbが同じと判定される理由は、文字列"abcdef"がメモリのどこかに格納され、そのアドレスがaに格納されます。実行時に同じ文字列をメモリに複数登録しないようになっているので、bもaと同じ文字列の格納アドレスになるためです。
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は等しくない!" );
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は等しくない!" );
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は等しくない!" );
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は等しくない!" );
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は等しくない!" );
以上です。