Javaで Stringの文字列結合について
Stringの文字列結合について、知らなかったことがあるので自分なりに説明してみます。
まず下記のプログラムの実行結果は何になるでしょう?
public static void main(String[] args) { String a1 = "aaa"; String a2 = "aaa"; // a1 == a2 は true // 同じ固定文字列なら新たにStringインスタンスを生成するのではなく // 同じインスタンスを返すようになり、参照は同一なので。 String str1 = "Hello" + "world"; String hello = "Hello"; String world = "world"; String helloWorld = hello + world; if(str1 == helloWorld) { System.out.println("str1 == helloWorldは trueです。"); }else { System.out.println("str1 == helloWorldは falseです。"); } }
str1 == helloWorldは true or false。 どちらになるでしょうか?
正解は、 str1 == helloWorldは falseになります。
プログラム中の一定の箇所は、コンパイル後下記のように置き換わる。
String str1 = "Hello" + "world"; // ↓ String str1 = "Helloworld"; String hello = "Hello"; String world = "world"; String helloWorld = hello + world; // ↓ String hello = "Hello"; String world = "world"; String helloWorld = (new StringBuilder(hello)).append(world).toString();
str1 == helloWorld がfalseということは、 str1とhelloWorldの参照先が違いますよ ってことです。
参照先が異なる理由は、StringBuilder#append().toString()の内部で「new String()」が使われているためです。
新たにインスタンスを生成されて、参照先が変わったってことですね。
参考先
Java文字列メモ(Hishidama's Java String Memo)
Java弱参照メモ(Hishidama's Java Weak reference Memo)
WeakHashMapの例外動作サンプルでの説明文。