0

そのため、1秒間に何度も2D配列を更新するJavaプログラムに取り組んでいます。元々、を使用して配列全体をコピーしてSystem.arrayCopy()いましたが、一度に1行しか更新しないため、これは明らかに悪い考えでした。代わりに、配列の仮想「ゼロ」への「ポインター」を使用することにしました。とにかく、動的なサイズ設定もサポートできるようにしたいと思いました。これを行う最も簡単な方法は、同じサイズを維持する1つの配列を用意し、仮想の最大長を示す数値を設定することです。配列。でもそれは記憶の無駄かもしれないと思っていました

上記の情報は、私が完全にばかげたことをしているのかどうか誰かが教えてくれるようにするためのものです。

TL;DR=次のことを行う場合...

int[][] data = new int[2000][]; // 2000 would be the max
for(int i=0; i<10; i++) {
    data[i] = new int[10];
}

...実際に初期化した100intに加えて、どのくらいのメモリを使用しましたか?null参照ごとに4バイトだけでしょうか?

4

3 に答える 3

2

すべてのnull参照に4バイト、ヘッダーに8〜16バイト。ほとんどの64ビットJVMは、最大約30GBのヒープサイズの32ビット参照を使用します。

于 2012-08-21T17:54:44.303 に答える
1

2D配列(Javaで他の配列を含む配列)の代わりに、要素として他のリストを含むjava.util.Listを使用することを検討してください。

リスト

  • 箱から出してよりインテリジェントになります
  • 動的サイジングを自動的にサポートします(パフォーマンスが最適化された方法で)
  • nullを含めることができます(初期化されていないサブ配列など)
  • 要件に応じてパフォーマンスを微調整できます(ArrayList、LinkedList、CopyOnWriteArrayList)...
于 2012-08-21T18:14:08.860 に答える
-1

はい、最初の行とループ(およびオブジェクトのオーバーヘッド)に2000*sizeof(ptr)バイトを使用します。10*10*sizeof(int)

于 2012-08-21T17:53:29.343 に答える