前回、
「文字列の比較」をテーマに
お話をしました。
Javaプログラミングにおいて、
文字列が同じかどうかを比較するには、
「==」演算子ではなく、
「equals」メソッドを使用する
という内容でした。
では、なぜ
整数(int型)は「==」演算子で
比較できるのに、
文字列(String型)は「==」演算子で
比較できないのでしょうか。
今回は、この疑問を解き明かしながら、
Javaプログラミングにおいて文字列を扱う際の
注意点をお話していきます。
「==」演算子で
文字列が比較できない理由
文字列を比較するときに
「==」演算子が使用できない理由は
下記の2つを確認すれば分かります。
・「==」演算子の挙動
・文字列の生成方法
「==」演算子の挙動
変数同士を「==」演算子で比較する場合、
変数に格納されている値同士を比較します。
例えば、
int b = 3;
if (a == b) {
System.out.println("同じ");
} else {
System.out.println("違う");
}
上記の結果は、"同じ"と表示されました。
変数aには3が格納されます。
また、変数bにも3が格納されます。
そのため、
変数aと変数bは同じものであると評価され
"同じ"と表示されました。
では、文字列の場合は
どうでしょうか。
String str2 = new String("あ");
if (str1 == str2) {
System.out.println("同じ");
} else {
System.out.println("違う");
}
上記の結果は、"違う"と表示されました。
つまり、変数str1と変数str2には
"あ"という文字列ではなく、
それぞれ違うものが格納されている、
ということになります。
では一体、
変数str1と変数str2には
何が格納されているのでしょうか。
理由2 文字列の生成方法
文字列を生成するときに、
「new」という演算子を使用しました。
String str2 = new String("あ");
実は、この「new」演算子は、
文字列を生成した後、
その文字列が
どこにあるかという情報(場所)を
値として返します。
そのため、変数str1には、
最初に生成された"あ"という
文字列の場所が格納され、
変数str2には、
次に生成された"あ"という
文字列の場所が格納されます。
2つの"あ"という文字列は
別々の場所に生成されるため、
結果的として変数str1と変数str2には
違う値が格納されることになります。
そのため、文字列の比較には、
「==」演算子が使用できない、
ということになります。
文字列の不思議
ここまでのお話で、
なぜ文字列の比較には、
「==」演算子が使用できないか、
分かって頂けたかと思います。
では最後に、
以下の例を考えてみましょう:
String str2 = "あ";
if (str1 == str2) {
System.out.println("同じ");
} else {
System.out.println("違う");
}
Javaでは、
文字列を生成する際に、
上記のようなコードを
記述することもできます。
上記の結果は、
どうなるでしょうか。
結果は...
"同じ"
と表示されます。
なぜ??
これは、
String str2 = new String("あ");
と
String str2 = "あ";
とでは、
文字列の生成方法に違いがあるためです。
「new」演算子を使用した場合は、
2つの"あ"が別々の場所に生成されます。
しかし、「new」演算子を
使用しない場合は、
メモリの無駄を無くすため、
コンパイルの際、自動的に
下記のようなコードに変換されます。
String str2 = str1;
上記の場合、
"あ"という文字列は
1つだけ生成され、
変数str1と変数str2には
同じ"あ"の場所が格納されます。
これにより、
「==」演算子で比較したときに
"同じ"
と表示されるわけです。
このように、
文字列の生成方法の違いにより、
比較の結果が変わることもあるため
注意してください。
-------------------------------------------------------
■□お知らせ□■ 新しいLAブログができました。
lsコマンドで覚えたい15のオプション【Linuxコマンド集】
他にも学習に役立つ情報が盛りだくさんです。是非ご覧ください。
------------------------------------------------------