2012-01-31 22 views
4
String a="A"; 
String b="B"; 
final String c="C"; 
final String d="D"; 

String e=a+b; 
String f=a+b; 
System.out.println(e==f);//false 

String g=c+d; 
String h=c+d; 
System.out.println(g==h);//true 

なぜそうですか?文字列オブジェクトは特別なメモリに作成され、文字列定数プールと呼ばれます。しかしここでは、最終的な変数の重要性は何ですか。最終参照変数の重要度

+1

finalは、一度初期化されると変数を変更できないことを意味します。間接的にこれは、コンパイラが変数を使って式の値を静的に計算するかもしれないことを意味します。そして、あらかじめ計算された文字列の値は、 '=='テストを真とすることができるように、インターンされます。 –

答えて

1

コンパイラはそれを見てcとdは最終的です。つまり、コンパイラはcとdが決して変化しないことを知っているので、コードをコンパイルして

String g = "CD"; 
String h = "CD"; 

gとhは、同じSTringリテラルに対する2つの参照です。

aとbは最終的なものではなく、従って変更することができるので、eとfを同じ方法で最適化することはできません。

+0

thanx!私はあなたが黙っている文字列であることを教えてください。 –

+0

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#intern%28%29を参照してください。 –

1

finalは、プログラムでこの文字列の値を後で変更できないことを意味します。また、:最終的な変数は、オブジェクトへの参照を保持している場合

、次いで オブジェクトの状態は、オブジェクトの操作によって変更することができるが、 変数は常に同じオブジェクトを参照します。 (source

4

finalキーワードは、文字列の異なるインスタンスに変数を再割り当てを防ぎます。そのため、String自体は不変ですが、明示的にfinalと指定されていない限り、それを参照する変数を変更することができます。

ここでは、あなたがここで経験しているものの正確なセマンティクスについてはっきりしていません。しかし、一般的に、変数はfinalであるため、"CD"以外の値を持つことはできません。この値はコンパイル時に計算され、それ自体が定数として扱うことができますインターン文字列のプール。

1

Javaコンパイラあなたは(という変数よりも、それらの定数作る)finalとしてあなたの変数を宣言していることを見て、コンパイル時にc+dを計算し、その結果を内部化。