プログラマメモ2 - programmer no memo2

いまさらながらJavaの文字列(String)を==で比較しちゃだめよ 2009/08/02

Javaです。

いまさらながら文字列の比較です。

下記のコードで出力される結果は、なんでしょうか。

public class Testストリング0 {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
System.out.println(a == b);
}
}


僕の環境ではtrueでした。

で、一瞬、いつから文字列の比較で==がOKになったのかしらと思いました。

気をとりなおして、下記のコードで検証。
public class Testストリング0 {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
a +="d";
b +="d";
System.out.println(a == b);
System.out.println(a.equals(b));
}
}


案の定、==では比較できませんでした。

:

とおりすがらー

Javaの文字列は不変オブジェクトです
なので再利用が可能です

再利用されると == で true になるのですね

不変オブジェクト(immutable)というのがミソです

ugo.nakawaka

>_<!
不変オブジェクトがミソなのですね!!!!!

Unknown

public static void main(String[] args) {
String a = "abc";
String b = "abc";
a += "d";
b += "d";
a = a.intern();
b = b.intern();
System.out.println(a == b);
System.out.println(a.equals(b));
}

とするとtrue,trueになります。

以下はjava documentsの引用です。
 戻り値:
 この文字列と同じ内容だが、一意の文字列のプールからのものであることが保証されている文字列

java詳しくないので的外れなコメントかもしれませんが・・

このブログのファンより。

PS
このブログは私の知りたいことが沢山書いてあります。

ugo.nakawaka

tky さん
コメントありがとうございます。
文字列.intern();
調べてみますです。

これからもごひいきに
>_<!

ugo.nakawaka

intern()ってnativeメソッドだった...