5

文字列はすでに Flyweight デザイン パターンを使用しています。共通の String オブジェクトをプールすることは有益/効率的ですか? 文字列はすでに文字列プールから引き出されるのでしょうか?

4

2 に答える 2

7

文字列はさまざまな場所から取得できます。デフォルトでは、文字列リテラルのみが文字列プールに含まれます。たとえば、 を呼び出すとBufferedReader.readLine()、返される文字列は文字列プールにありません。

そのような文字列をプールすることに意味があるかどうかは、String.intern()マップを使用するか正規化するかのどちらかであり、重複の量と、その重複を減らすためにどれだけのメモリを確保できるかによって異なります。

たとえば、XML ファイルを読んでいる場合、要素名を正規化すると非常に便利な場合があります。住所データのファイルを読み取る場合、郵便番号や都市名を正規化すると便利な場合があります。ただし、どちらの場合も、 をMap呼び出すのではなく、を使用することを検討しintern()ます。これは、後者が permgen メモリ (通常のヒープ メモリよりも少ないリソース) を消費するためです。

于 2011-03-31T19:09:36.520 に答える
3

システムに関する他の情報がなければ、文字列の特定の目的のプールを作成することは時期尚早の最適化のカテゴリに分類されると言えます。あなたのシステムが実際に非常に文字列操作が多く、プロファイリングが文字列オブジェクトが主要なガベージ コレクションが発生する理由であることを示している場合は、代わりに StringBuilder を検討し、代わりに文字列を操作するベスト プラクティスを深く理解することをお勧めします。それらのキャッシュを作成します。

于 2011-03-31T19:11:14.937 に答える