列出没有分配的impl

时间:2013-09-09 03:57:16

标签: java garbage-collection

你知道一个类似java.util.List的实现,它永远不会为.add(T)方法分配对象吗?我知道HugeCollections将对象存储在直接内存中,但它仍然在堆上分配对象来调整大小。

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

感谢。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

如果你需要一个任意增长的列表,那么事情会更复杂。如果您可以控制要存储的对象,则可以使用intrusive container。我不知道Java的侵入式容器的任何罐装实现,但您可以查看Joachim Sauer's answer outlining how to write one。从本质上讲,它是一个完全正常的链表,但您存储的对象提供了链接字段,因此您无需分配任何额外的存储空间来将它们添加到列表中。还有一些其他优点,例如,如果您已经拥有实际对象,则能够在O(1)时间内删除对象。当然也有一些缺点。

答案 2 :(得分: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()