2011-08-22 10 views
4

文字列プールで私の概念が明確かどうかは疑問です。Java文字列プールオブジェクトの作成

String s1 = "abc"; 
String s2 = "def"; 
s2 = s2 + "xyz"; 

3)

1)

String s1 = "abc"; 
String s2 = "def"; 
s2 + "xyz"; 

2 - :次のコードのセットを研究し、私の答えは次の文のセットの後に作成されたオブジェクトの数に正しいかどうかを確認してください)

String s1 = "abc"; 
String s2 = "def"; 
String s3 = s2 + "xyz"; 

4)

String s1 = "abc"; 
String s2 = "def"; 
s2 + "xyz"; 
String s3 = "defxyz"; 

私が概念的に知っているところでは、上記の4つのケースすべてで、各行の実行後に4つのオブジェクトが作成されます。

+0

なぜ、たとえば3番に4つのオブジェクトがあるのか​​、理由を教えてください。 – djna

+0

最初の3つにはそれぞれ3つの文字列オブジェクトしかありません。 –

+0

@djna:True。コンパイラは、コンパイル時にs2 + "xyz"を評価できるので、3つのオブジェクトだけを自由に使用できます。 – Thilo

答えて

7

s2 + "xyz"のような式は単独では使用できません。コンパイラによって定数のみが評価され、文字列定数のみが文字列リテラルプールに自動的に追加されます。

final String s1 = "abc"; // string literal 
String s2 = "abc"; // same string literal 

String s3 = s1 + "xyz"; // constants evaluated by the compiler 
         // and turned into "abcxyz" 

String s4 = s2 + "xyz"; // s2 is not a constant and this will 
         // be evaluated at runtime. not in the literal pool. 
assert s1 == s2; 
assert s3 != s4; // different strings. 
1

なぜ気になりますか?このうちのいくつかは、コンパイラがどの程度積極的に最適化して実際の正解がないかによって決まります。