文字列は参照型変数

参照型変数とは

javaの文字列が基本データ型でないことを説明します。javaは文字列をそのまま変数に保存するのではなく、「文字列をどこに格納したか」の情報を保存しています。この様な方法を使う変数を参照型変数と呼ぶことがあります。変数に代入された情報はデータそのものでなくデータを参照するために必要な情報だということです。文字列を比較する場合に違いが出ますので検証してみます。

まずは基本データ型であるintの場合

javaでは = は代入の演算子ですが、== は比較の演算子です。等しい場合は true 等しくない場合は false という boolean の値が帰ってきます。intで確認します。

ファイル名 Eqtest.java

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

参照型であるStringの場合

下記のプログラムの前半はintの場合と同じです。

ファイル名 Eqtest2.java

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)

課題

1.

上の Eqtest.java Eqtest2.java をつくって結果を確認しなさい。

2.

ファイル名 Eqtest3.java

文字変数の値と、文字リテラルの比較がequals()でできるか試しなさい。

つまりは、下記のようなことができるかということ。

s1.equals("abcd")
"abcd".equals(s1)

Javaプログラミング(May.2011)
聖愛中学高等学校
http://www.seiai.ed.jp/