0

コードに以下の宣言があります。

String[] array1 = new String[];

array1 に 1.000.000 個の要素 (すべて 80 文字の文字列) がある場合、どれくらい重いですか? 私はRAMメモリを意味します。

4

2 に答える 2

7

答えは、それが多くの要因に依存するということです:

  • 使用しているJVM。つまり、プロバイダーとバージョン
  • 32ビットまたは64ビットのJVMを使用しているかどうか。
  • 「圧縮されたoops」を使用しているかどうか(64ビットのHotSpot JVMの場合:-XX:+ UseCompressedOops)。
  • UTF-8文字列を使用しているかどうか(一部のHotSpot JVMはこれをサポートしています:-XX:+ UseCompressedStrings)
  • 文字列配列の要素がそうであるかどうかnull
  • 文字列配列の要素が同じ参照であるかどうか、
  • 文字列がインターンされているかどうか、およびインターンが効果的かどうか、
  • 文字列が同じバッキング配列を共有するかどうか、
  • 等々。

動的に作成された文字列は、デフォルトではインターンされません。それらをインターンする場合、データセットに「等しい」文字列が多数ある場合は、スペースを節約できます。しかし、文字列プールの裏側にストレージオーバーヘッドがある場合(これは大きなハッシュテーブルです)、等しくない文字列に等しい比率が小さすぎる場合は、スペースを節約するのではなく無駄にします。

バッキングアレイに関するポイントも複雑です。背景は、split(たとえば)メソッドが元のStringの文字配列を共有するStringオブジェクトを作成することです。同じ元の文字列のサブ文字列をたくさん作成すると、スペースを節約できます。ただし、逆に、大きな文字列の小さなサブ文字列を作成すると、元の文字列のバッキング配列全体に到達可能なままになる可能性があります。

于 2012-04-05T13:24:32.470 に答える
4

それは実装依存です。内部で UTF-16 エンコーディングを使用する一般的な JVM を想定すると、次のようになります。

100 万要素 * 80 文字 * 2 バイト = 1 億 6000 万バイトのテキスト データ。

各文字列の内部データ構造 (たとえば 16 バイト程度)、各文字列への参照 (たとえば 8 バイト)、および配列自体 (たとえば 12 バイト) の少しのオーバーヘッドを追加すると、次のようになります。

184,000,012 バイト

于 2012-04-05T13:01:02.443 に答える