4

int、char などのプリミティブ データ型オブジェクトの配列リストを割り当てたい (将来的に増加するため配列ではない) が、RAM 内の連続したメモリ位置 (jvm 管理ヒープ) に格納する必要があります。しかし、exのプリミティブデータ型のArrayListを宣言したときから。int の ArrayList。内部的に jvm は ArrayList < Integer > タイプのオブジェクトにマップします。
ここでの問題は、ArrayList が jvm 管理メモリ空間の異なる場所に格納されているオブジェクトへの連続した参照を保持していることです。しかし、私の最初のアイデアは、単なる参照ではなく、実際のデータ オブジェクトを連続的に格納することでした。しかし、私はそれを達成する方法がわかりませんか?

私が考えることができる1つの解決策は、大きなサイズのバイト配列を割り当てて、連続したメモリバッファストアを作成することです! また、開発者は、事前に割り当てられた 2000 バイトに 1000 個の int オブジェクトが格納されている場合、この手動で作成されたバッファー (2 バイト/int としてモデル化する場合) に格納された int データを 101 インデックス位置に取得する方法を管理する必要があります。



複雑なデータ型でも同じ機能が望ましいです。構造体のサイズを計算し、(structureSize * 期待される要素の数) のバイト バッファを事前に割り当てる必要があるため、複雑なオブジェクトの連続したメモリ割り当てを処理するのは難しい場合があります。



オブジェクトの連続した割り当て(プリミティブ/複雑>)に可能な他の効率的な方法や解決策は考えられません。誰か助けてくれますか?

4

4 に答える 4

2

お客様の要件を満たす単一のソリューションはありません。

プリミティブ型の配列のような構造が必要な場合は、そのプリミティブ型の配列またはそのプリミティブ型の配列をラップするクラスを使用する必要があります1。カスタム クラスを実装しようとする場合、プリミティブ型はジェネリック型パラメーターとして使用できないため、(プリミティブ型で) ジェネリックにすることはできません。ArrayListしたがって、から派生した やその他の型にすることはできませんCollection

参照型の配列のような構造が必要な場合は、配列またはArrayList.


Integerつまり、ラッパータイプ (など)を使用したくない場合:

  • プリミティブ型と非プリミティブ型を別々に扱う必要があります。
  • (API 設計とタイプ セーフの観点から) 個々のプリミティブ型を別々に扱うのが最善です。

仮に、ランタイム パラメータに応じて、任意のプリミティブ型の配列を実装する配列のような型を作成できます。さまざまなプリミティブ型を取得/設定するためのメソッド/オーバーロードをたくさん定義するだけです。ただし、それはコンパイル時のタイプ セーフではなく、API は醜いものになります。控えめに言っても。

a を使用するというあなたの考えは、ByteBuffer本質的に上記と同じです...または、アプリケーションコードがバイトと概念的な「配列」ベースタイプの間のインデックス付けとエンコード/デコードのすべてを行うと予想している場合は、さらに悪いことです。byte[](そして、 aではなく aから始めたほうがよいでしょうByteBuffer。)


1 - たとえば、Trove コレクション クラスの 1 つ。

于 2013-08-21T04:27:09.340 に答える
1

免責事項: これはとにかく指定されていないため、可能性があります。

OpenJDK/Oracle JVM では、オブジェクトは TLAB 内で順番に割り当てられます。サバイバー/テニュア スペースにコピーされると、逆の順序で検出されます。これは、オブジェクトがキャッシュ内で一緒になる可能性が高いことを意味します。

簡単な解決策は、プリミティブが実際にはプリミティブ配列にある Trove のようなプリミティブ ベースのコレクションを使用することです。

于 2013-08-21T05:58:18.650 に答える
1

多くのプリミティブ コレクション プロジェクトがあり、その一部を次に示します。

  1. org.apache.commons.collections.primitives
  2. 高パフォーマンスのプリミティブ コレクション
  3. トローブ

ただし、そのようなものを使用すると、実装が難しくなることに注意してください。共通のプリミティブ コレクション API はありません。

于 2013-08-21T07:53:22.650 に答える