いまさらながらJavaの文字列(String)を==で比較しちゃだめよ
2009/08/02
java
Javaです。
いまさらながら文字列の比較です。
下記のコードで出力される結果は、なんでしょうか。
public class Testストリング0 {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
System.out.println(a == b);
}
}
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));
}
}
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)というのがミソです
>_<!
不変オブジェクトがミソなのですね!!!!!
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
このブログは私の知りたいことが沢山書いてあります。
tky さん
コメントありがとうございます。
文字列.intern();
調べてみますです。
これからもごひいきに
>_<!
intern()ってnativeメソッドだった...