internメソッドは、文字列の正規形を返します。文字列自体とは異なる場合も同じ場合もあります。パフォーマンスを向上させるのに役立ちますか、それとも単に不確実性を取り除くのに役立ちますか?
3 に答える
intern
文字列をまったく変更しません。通常のヒープの一部ではない専用の定数プールにメモリを割り当てるだけです(永続的な世代にあります)。パフォーマンスは間接的にのみ改善されます。インターンされた 2 つの文字列を比較していることがわかっている場合は、==
代わりにequals
.
intern() は、重複する文字列の数を減らすことでパフォーマンスを向上させます。これにより、メモリ消費量が削減されますが、さらに重要なことに、キャッシュの使用が改善されます。(キャッシュはメインメモリよりもはるかに小さいです)
ただし、このプールにあまりにも多くの文字列を配置すると、直接使用するとパフォーマンスの問題が発生する可能性があります (通常のプログラムでは行うことではありませんが、そうするようにプログラムを作成できます)。これは、文字列をプールに追加するのにコストがかかるためです O (N) O(log N) ではなく、クリーンアップにさらに費用がかかります。Java 7 では、大きな文字列リテラル プールの影響を軽減するために、文字列リテラル プールがヒープに移動されましたが、使用する場合でも控えめに使用することをお勧めします。
文字列に対して intern メソッドを呼び出すと、文字列プールにその文字列があるかどうかがチェックされます。存在する場合はその文字列への参照が返され、存在しない場合は新しい文字列がプールに追加されます。 == equals の代わりに (== check はオブジェクトの内容ではなくオブジェクトのアドレスのみを比較するため高速です)、文字列の比較に == を使用しないことを強くお勧めします。