あなたの質問に対する答えは、実装に依存し、誤解を招くものです。コードフラグメントの終わりまでに2〜4個の「文字列オブジェクト」が存在する可能性があります。正確には、JVMに依存する数と、インターンの小さな文字列(あるとしても)がどれだけ積極的に存在するかを示します。指摘されているように、JDKのドキュメントではString.toString()がオブジェクトを返すように指定されているため、答えは「2または3」である必要があります。ただし、この動作に依存するのは非常に愚かです。
これが誤解を招くと私が言う理由は、「文字列オブジェクトの数」について心配する必要がないからです。Javaのオブジェクトは非常に軽量であり、それらを数えることを心配する必要はありません。
私が追加する唯一の資格は、オブジェクト数は気にしないが、参照は気にするということです。文字列の場合、厄介な驚きは、基になるchar配列への参照の数です。文字列オブジェクトはchar配列を共有するフライウェイトであり、これを忘れると深刻なメモリリークが発生する可能性があります。Javaプログラムのヒープを使い果たす非常に簡単な方法は、次のとおりです。
while(!multiGBFileEOF) {
String bigString = readMultiMBString();
int index = findSmallFeature(bigString);
String featureOfInterest = bigString.substring(index, index+4);
featureList.add(featureOfInterest);
}
featureListは、最大で数10KB(各1000リストアイテム*(arrayrefの場合は4〜8バイト+オブジェクトの場合は12〜20バイト+ char配列の場合は8〜16バイト))、つまり些細なものになるはずです。一部の一般的なJVM実装は、substring()によって生成された文字列のバッキング配列を共有します。これにより、ファイル全体をメモリに格納しようとする可能性があります。解決策は、を呼び出して基になる配列の明示的なコピーを強制するString copy = new String(featureOfInterest)
ことです。ここでは気にしません。copy
とが同じオブジェクトであるかどうかは、背後のchar配列をエイリアスしないfeatureOfInterest
限りです。copy
bigString
あなたの学習で頑張ってください。