インターンは舞台裏で行われるものなので、プログラマーとしてのあなたはそれについて心配する必要はありません。通常、プールに何かを入れたり、プールから何かを取得したりする必要はありません。ガベージコレクションのように、それを呼び出す必要はなく、発生する可能性があることを心配したり、発生しない可能性があることを心配したりする必要はありません。(まあ、99.999%のケースで。残りの0.001%は、非常に奇妙なことをしているときです。)
コンパイラは、ソースファイルに含まれるすべての文字列リテラルのインターンを処理するため、「lalala」は、何もしなくても、または問題を制御することなく、インターンされます。また、プログラムで「lalala」を参照するときはいつでも、コンパイラーは、何もしなくても、問題を制御することなく、インターンプールからそれをフェッチするようにします。
インターンプールには、多かれ少なかれ固定数の文字列が含まれており、通常は非常に小さいサイズ(.exeの合計サイズのほんの一部)であるため、ガベージコレクションが行われないことは問題ではありません。
編集
文字列をインターンする目的は、Equals()などの特定の文字列操作の実行時間を大幅に改善することです。最初に文字列が参照によって等しいかどうかをチェックするEquals()
方法は、非常に高速です。String
参照が等しい場合は、true
すぐに戻ります。参照が等しくなく、文字列が両方ともインターンされているfalse
場合、インターンプール内のすべての文字列が互いに異なるため、それらが等しくなる可能性はないため、すぐに返されます。上記のいずれにも当てはまらない場合は、文字列ごとの比較が続行されます。(実際には、文字列のハッシュコードもチェックするため、それよりもさらに複雑ですが、この説明では単純にしましょう。)
したがって、文字列内のファイルからトークンを読み取っs
ていて、次の形式のswitchステートメントがあるとします。
switch( s )
{
case "cat": ....
case "dog": ....
case "tod": ....
}
文字列リテラル「cat」、「dog」、「tod」はすべてインターンされていますが、s
インターンされていない、と比較しているため、インターンプールのメリットを享受していません。s
switchステートメントの直前でインターンを行うと、switchステートメントによって実行される比較がはるかに高速になります。
もちろん、ファイルにガベージが含まれている可能性がある場合は、これを実行しないでください。インターンプールにランダムな文字列を大量にロードすると、プログラムのパフォーマンスが低下し、最終的にメモリが不足するためです。 。