[.net] 文字列の不変性



Answers

リテラル文字列が格納されているということは、 "hello "はヒープ上にはなく 、プログラムのデータセグメント[コメントを参照]に存在する(ガベージコレクションの対象にはならない)ことを意味し、 "world"コンパイラが十分にスマートな場合には、インターナショナルでもあるかもしれない"hello world"意味します。

文字列リテラルの連結はコンパイラによって処理されるため、 "goodbye cruel world" 禁止されます。

編集:私はデータセグメントのステートメントについてはわからない、詳細についてはこの質問を参照してください。

Question

文字列の不変性は、ステートメントまたはステートメント内の文字列によって機能しますか?

たとえば、次のコードはヒープに2つの文字列を割り当てることを理解しています。

string s = "hello ";
s += "world!";

"hello"はガベージが収集されるまでヒープ上に残ります。 現在、「hello world!」と参照しています。 ヒープ上に。 しかし、次の行はヒープに割り当てられる文字列の数... 1または2? また、結果を検証するツール/方法はありますか?

string s = "goodbye " + "cruel world!";



1つまたは2つの文字列連結を行う場合は、私はそれについて心配しません。

しかし、多くの連結がある場合やループがある場合は、確実に予防措置を取る必要があります。 Javaの世界では、文字列を連結する代わりにStringBufferを使用することを意味します。




あなたが文字列について知っていることを信用しないでください。 あなたは、文字列の実装のためのソースコードを見ているかもしれません。 たとえば、あなたの例:

string s = "goodbye " + "cruel world!";

javaでは、単一の文字列を割り当てます。 Javaはかなりかわいいトリックを演じて、あなたが必要とするまで、決して最適化することができません。

現在のところ、私が知る限り、これを使用して:

String s="";
for(int i=0;i<1000;i++)
    s+=" ";

1000スペース文字列を作成することは依然として極めて非効率的である傾向があります

ループでの追加はかなり悪いですが、それ以外の場合はおそらくStringBuilderと同じくらい効果的です。







Links