你知道一个类似java.util.List的实现,它永远不会为.add(T)方法分配对象吗?我知道HugeCollections将对象存储在直接内存中,但它仍然在堆上分配对象来调整大小。
我意识到这是一个奇怪的要求。这是一个一次性的用例,构建一个堆感知工具。
感谢。
答案 0 :(得分:2)
查看我的开源原始集合库Banana。 列表API与java.util.List不同,但它确实提供了一个链接列表,当您将项目添加到列表时,该列表不会分配内存。 查看项目Wiki以获取更多信息。
答案 1 :(得分:1)
正如评论所建议的那样,如果您可以容忍固定大小的列表,则固定大小的ArrayList
或Arrays::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()
。