.add(T) メソッドにオブジェクトを割り当てない java.util.List のような実装を知っていますか? オブジェクトを直接メモリに格納するHugeCollectionsについては知っていますが、オブジェクトをヒープに割り当ててサイズを変更します。
変なお願いだということはわかっています。これは、ヒープ対応ツールを構築する 1 回限りの使用例です。
ありがとう。
.add(T) メソッドにオブジェクトを割り当てない java.util.List のような実装を知っていますか? オブジェクトを直接メモリに格納するHugeCollectionsについては知っていますが、オブジェクトをヒープに割り当ててサイズを変更します。
変なお願いだということはわかっています。これは、ヒープ対応ツールを構築する 1 回限りの使用例です。
ありがとう。
私のオープン ソースのプリミティブ コレクション ライブラリであるBananaを調べてください。そこにあるリスト API は java.util.List と同じではありませんが、リストにアイテムを追加するときにメモリを割り当てないリンク リストを提供します。詳細については、プロジェクト wiki を確認してください。
コメントが示唆しているように、固定サイズのリストを許容できる場合は、固定サイズArrayList
またはArrays::asList
シンプルで効率的なオプションです。
任意に拡張可能なリストが必要な場合は、さらに複雑になります。保存しているオブジェクトを制御できる場合は、侵入型コンテナを使用できます。Java用の侵入型コンテナの定型実装については知りませんが、Joachim Sauerの回答で、1つの作成方法の概要を説明しているのを見ることができます。基本的に、これは完全に通常のリンク リストですが、格納するオブジェクトはリンク フィールドを提供するため、それらをリストに追加するために追加のストレージを割り当てる必要はありません。実際のオブジェクトが既にある場合、O(1) 時間でオブジェクトを削除できるなど、他にもいくつかの利点があります。もちろん、いくつかの欠点もあります。
add メソッドをオーバーライドして成長を止めるのはとても簡単です。
public class FixedArrayList<T> extends ArrayList<T> {
private final int size;
public FixedArrayList(int size) {
super(size);
this.size = size;
}
public void add(T t) {
if (size() == size) {
// throw exception or do nothing
}
super.add(t);
}
}
必要に応じてオーバーライドすることもできますaddAll()
。