文字列を扱う際の注意点

文字列を扱う際の注意点

前回、
「文字列の比較」をテーマに
お話をしました。

Javaプログラミングにおいて、

文字列が同じかどうかを比較するには、
「==」演算子ではなく、
「equals」メソッドを使用する

という内容でした。

では、なぜ
整数(int型)は「==」演算子で
比較できるのに、
文字列(String型)は「==」演算子で
比較できないのでしょうか。

今回は、この疑問を解き明かしながら、
Javaプログラミングにおいて文字列を扱う際の
注意点をお話していきます。

「==」演算子で
文字列が比較できない理由

文字列を比較するときに
「==」演算子が使用できない理由は
下記の2つを確認すれば分かります。

・「==」演算子の挙動
・文字列の生成方法

「==」演算子の挙動

変数同士を「==」演算子で比較する場合、
変数に格納されている値同士を比較します。

例えば、

int a = 3;
int b = 3;

if (a == b) {
System.out.println(“同じ”);
} else {
System.out.println(“違う”);
}

上記の結果は、”同じ”と表示されました。

変数aには3が格納されます。

また、変数bにも3が格納されます。

そのため、
変数aと変数bは同じものであると評価され
“同じ”と表示されました。

では、文字列の場合は
どうでしょうか。

String str1 = new String(“あ”);
String str2 = new String(“あ”);

if (str1 == str2) {
System.out.println(“同じ”);
} else {
System.out.println(“違う”);
}

上記の結果は、”違う”と表示されました。

つまり、変数str1と変数str2には
“あ”という文字列ではなく、
それぞれ違うものが格納されている、
ということになります。

では一体、
変数str1と変数str2には
何が格納されているのでしょうか。

理由2 文字列の生成方法

文字列を生成するときに、
「new」という演算子を使用しました。

String str1 = new String(“あ”);
String str2 = new String(“あ”);

実は、この「new」演算子は、
文字列を生成した後、

その文字列が
どこにあるかという情報(場所)を
値として返します。

そのため、変数str1には、
最初に生成された”あ”という
文字列の場所が格納され、

変数str2には、
次に生成された”あ”という
文字列の場所が格納されます。

2つの”あ”という文字列は
別々の場所に生成されるため、
結果的として変数str1と変数str2には
違う値が格納されることになります。

そのため、文字列の比較には、
「==」演算子が使用できない、
ということになります。

文字列の不思議

ここまでのお話で、
なぜ文字列の比較には、
「==」演算子が使用できないか、
分かって頂けたかと思います。

では最後に、
以下の例を考えてみましょう:

String str1 = “あ”;
String str2 = “あ”;

if (str1 == str2) {
System.out.println(“同じ”);
} else {
System.out.println(“違う”);
}

Javaでは、
文字列を生成する際に、
上記のようなコードを
記述することもできます。

上記の結果は、
どうなるでしょうか。

結果は…

“同じ”

と表示されます。

なぜ??

これは、

String str1 = new String(“あ”);
String str2 = new String(“あ”);

String str1 = “あ”;
String str2 = “あ”;

とでは、
文字列の生成方法に違いがあるためです。

「new」演算子を使用した場合は、
2つの”あ”が別々の場所に生成されます。

しかし、「new」演算子を
使用しない場合は、
メモリの無駄を無くすため、

コンパイルの際、自動的に
下記のようなコードに変換されます。

String str1 = new String(“あ”);
String str2 = str1;

上記の場合、
“あ”という文字列は
1つだけ生成され、
変数str1と変数str2には
同じ”あ”の場所が格納されます。

kohsaka

これにより、
「==」演算子で比較したときに

“同じ”

と表示されるわけです。

このように、
文字列の生成方法の違いにより、
比較の結果が変わることもあるため
注意してください。

——————————————————-
■□お知らせ□■ 新しいLAブログができました。
lsコマンドで覚えたい15のオプション【Linuxコマンド集】
他にも学習に役立つ情報が盛りだくさんです。是非ご覧ください。
——————————————————