1

.add(T) メソッドにオブジェクトを割り当てない java.util.List のような実装を知っていますか? オブジェクトを直接メモリに格納するHugeCollectionsについては知っていますが、オブジェクトをヒープに割り当ててサイズを変更します。

変なお願いだということはわかっています。これは、ヒープ対応ツールを構築する 1 回限りの使用例です。

ありがとう。

4

3 に答える 3

2

私のオープン ソースのプリミティブ コレクション ライブラリであるBananaを調べてください。そこにあるリスト API は java.util.List と同じではありませんが、リストにアイテムを追加するときにメモリを割り当てないリンク リストを提供します。詳細については、プロジェクト wiki を確認してください。

于 2013-09-09T08:50:43.073 に答える
1

コメントが示唆しているように、固定サイズのリストを許容できる場合は、固定サイズArrayListまたはArrays::asListシンプルで効率的なオプションです。

任意に拡張可能なリストが必要な場合は、さらに複雑になります。保存しているオブジェクトを制御できる場合は、侵入型コンテナを使用できます。Java用の侵入型コンテナの定型実装については知りませんが、Joachim Sauerの回答で、1つの作成方法の概要を説明しているのを見ることができます。基本的に、これは完全に通常のリンク リストですが、格納するオブジェクトはリンク フィールドを提供するため、それらをリストに追加するために追加のストレージを割り当てる必要はありません。実際のオブジェクトが既にある場合、O(1) 時間でオブジェクトを削除できるなど、他にもいくつかの利点があります。もちろん、いくつかの欠点もあります。

于 2013-09-09T08:58:30.930 に答える
0

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()

于 2013-09-09T09:05:29.223 に答える