1

您是否知道从不为 .add(T) 方法分配对象的类似 java.util.List 的实现?我知道HugeCollections将对象存储在直接内存中,但它仍然在堆上分配对象以调整大小。

我意识到这是一个奇怪的要求。这是一个一次性用例,构建了一个堆感知工具。

谢谢。

4

3 回答 3

2

查看Banana,我的开源原始集合库。那里的列表 API 与 java.util.List 不同,但它确实提供了一个链表,当您将项目添加到列表时不会分配内存。查看项目 wiki 以获取更多信息。

于 2013-09-09T08:50:43.073 回答
1

正如评论所建议的那样,如果您可以容忍固定大小的列表,则固定大小ArrayList或是一个简单而有效的选择。Arrays::asList

如果你需要一个可任意增长的列表,那么事情就更复杂了。如果您可以控制要存储的对象,则可以使用侵入式容器。我不知道 Java 的侵入式容器的任何罐头实现,但您可以查看Joachim Sauer 的回答,概述如何编写一个. 本质上,它是一个完全正常的链表,但是您存储的对象提供了链接字段,因此您不需要分配任何额外的存储空间来将它们添加到链表中。还有一些其他优点,例如如果您已经拥有实际对象,则能够在 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 回答