すでに初期化されている文字列があります。ここで、内容を文字配列に置き換えたいと思います。次のことを行っているかどうかを知りたい:
stringObj = new String(charArr);
結構です?
これにより、メモリリークが発生しますか?
この質問がすでに回答されている場合は申し訳ありませんが、これに対する回答がまったく見つかりませんでした。
すでに初期化されている文字列があります。ここで、内容を文字配列に置き換えたいと思います。次のことを行っているかどうかを知りたい:
stringObj = new String(charArr);
結構です?
これにより、メモリリークが発生しますか?
この質問がすでに回答されている場合は申し訳ありませんが、これに対する回答がまったく見つかりませんでした。
もちろん、大丈夫です。参照は新しい文字列を参照します。古いものはGCの対象です。
intern と perm スペースにはいくつかの考慮事項がありますが、メモリ リークはありません。これがJavaの仕組みです。
このような構造によってコードが損なわれることはありません。ベスト プラクティスに留意することは素晴らしいことですが、データのない時期尚早の最適化は負けゲームです。できる限りアプリを作成し、パフォーマンスが許容できない場合はプロファイリングし、パフォーマンスの問題に最も寄与している問題を修正します。問題がどこにあるかを知っていると想像しようとしないでください。
String への 1 つの参照のみを変更したことを理解することが重要です。他の参照がある場合、それらはまだ古い String オブジェクトを指しています。これにより、ガベージ コレクションが妨げられ、古い値が引き続き使用されることになります。
特に、stringObj を引数として渡されたメソッド内でこれを行う場合、呼び出し元の参照は代入の影響を受けません。
つまり、stringObj はオブジェクトではありません。オブジェクトへのポインタです。その 1 つのポインターを変更して、新しいオブジェクトを指すようにします。
心配しないで。ガベージ コレクターが処理します。-> http://javarevisited.blogspot.co.at/2011/04/garbage-collection-in-java.html
文字列は不変であるため、最終的には新しいオブジェクトが取得され、以前のオブジェクトに置き換えられません。この例では、これは 1 つの文字列のみであるためメモリ リークは発生しませんが、アプリケーションがこの方法で大量の文字列操作に基づいている場合、メモリ リークが発生します。StringBuffer または String Builder を使用する必要があります。
String stringobj = "This is fine";
stringobj = new String(charArray);
実際には、stringobj には新しい Char 配列を含むメモリ位置の参照が含まれ、以前の位置はガベージ コレクターによって処理されます。