您是否知道从不为 .add(T) 方法分配对象的类似 java.util.List 的实现?我知道HugeCollections将对象存储在直接内存中,但它仍然在堆上分配对象以调整大小。
我意识到这是一个奇怪的要求。这是一个一次性用例,构建了一个堆感知工具。
谢谢。
您是否知道从不为 .add(T) 方法分配对象的类似 java.util.List 的实现?我知道HugeCollections将对象存储在直接内存中,但它仍然在堆上分配对象以调整大小。
我意识到这是一个奇怪的要求。这是一个一次性用例,构建了一个堆感知工具。
谢谢。
查看Banana,我的开源原始集合库。那里的列表 API 与 java.util.List 不同,但它确实提供了一个链表,当您将项目添加到列表时不会分配内存。查看项目 wiki 以获取更多信息。
正如评论所建议的那样,如果您可以容忍固定大小的列表,则固定大小ArrayList
或是一个简单而有效的选择。Arrays::asList
如果你需要一个可任意增长的列表,那么事情就更复杂了。如果您可以控制要存储的对象,则可以使用侵入式容器。我不知道 Java 的侵入式容器的任何罐头实现,但您可以查看Joachim Sauer 的回答,概述如何编写一个. 本质上,它是一个完全正常的链表,但是您存储的对象提供了链接字段,因此您不需要分配任何额外的存储空间来将它们添加到链表中。还有一些其他优点,例如如果您已经拥有实际对象,则能够在 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()
如果你愿意,你也可以覆盖。