javaの文字列が基本データ型でないことを説明します。javaは文字列をそのまま変数に保存するのではなく、「文字列をどこに格納したか」の情報を保存しています。この様な方法を使う変数を参照型変数と呼ぶことがあります。変数に代入された情報はデータそのものでなくデータを参照するために必要な情報だということです。文字列を比較する場合に違いが出ますので検証してみます。
javaでは = は代入の演算子ですが、== は比較の演算子です。等しい場合は true 等しくない場合は false という boolean の値が帰ってきます。intで確認します。
public class Eqtest { public static void main( String[] args ) { int a = 2 ; int b = 2 ; System.out.print( a + " = " + b + " ? " ); System.out.println( a == b ); b = 3 ; System.out.print( a + " = " + b + " ? " ); System.out.println( a == b ); } }
一回目の a == b は両方共値が 2 なので、true。二回目は、2と3なので false です。
次の様に表示されます。
z1c3s@star00:~/java$ java Eqtest2 2 = 2 ? true 2 = 3 ? false
下記のプログラムの前半はintの場合と同じです。
public class Eqtest2 { public static void main( String[] args ) { String s1 = "abcd"; String s2 = "abcd"; System.out.print( "(1)" + s1 + " = " + s2 + " ? " ); System.out.println( s1 == s2 ); s2 = "ab"; System.out.print( "(2)" + s1 + " = " + s2 + " ? " ); System.out.println( s1 == s2 ); // ここまではintに同じ。この後が異なる s2 = s2 + "cd"; System.out.print( "(3)" + s1 + " = " + s2 + " ? " ); System.out.println( s1 == s2 ); System.out.print( "(4)" + s1 + " = " + s2 + " ? " ); System.out.println( s1.equals(s2) ); } }
(1)(2)は問題ありません。 一回目の s1 == s2 は両方共値が "abcd" なので、true。二回目は、"abcd" と "ad" なので false です。
でも(3)はどうでしょう。
z1c3s@star00:~/java$ java Eqtest2 (1)abcd = abcd ? true (2)abcd = ab ? false (3)abcd = abcd ? false (4)abcd = abcd ? true
(3)は、"ab" + "cd" は "abcd" ですから、両方共 "abcd" という文字列が入っているのに等しくないと報告されています。
Stringが基本データ型でないので、等しいかどうかは == 演算子で調べたのではわかりません。値が等しくても true になったり false になったりします。
Stringで値が等しいかどうかは上記の様に equals() メソッドで調べます。下記のどちらでも使えます。
s1.equals(s2) s2.equals(s1)
上の Eqtest.java Eqtest2.java をつくって結果を確認しなさい。
文字変数の値と、文字リテラルの比較がequals()でできるか試しなさい。
つまりは、下記のようなことができるかということ。
s1.equals("abcd") "abcd".equals(s1)