あるぇー?

最近になって仕様が変わったのかな? 知らなかったの僕だけ?

package jp.devworks.sample;

public class StringCompare {

	public static void main(String[] args) {
		String s = "01";
		String s2 = "01";
		
		System.out.println(s == s2);
	}
}

false が返ってくるとおもったら true が返ってくる。「こんな実装しちゃだめだよー」って言おうとしてサンプルコード書いたら結果がこうなので驚いてる。
あ、あるぇー?
(追記)
JDK 1.5.09 と 1.6.07 で試した。結果は同じ。 true が返る。
(追記その2)
id:nowokay さんが教えてくれました。

クラスローダーが同じならリテラルは共有されます。
やりたかったら
String s = "0";
String s2 = s + 1;
s = s + 1;
System.out.println(s == s2);
とか

あるぇー? - devworks

なるほど。やってみた

package jp.devworks.sample;

public class StringCompare {

	public static void main(String[] args) {
		String s = "01";
		String s2 = s + 1;
		s = s + 1;
		System.out.println(s == s2);
	}
}

false が返ってくる。ちょっと賢くなりました。あざっす!