我在列表中有100,000个对象。我想根据条件从列表中删除一些元素。任何人都可以告诉我实现内存和性能的最佳方法是什么。
同样基于条件添加对象的问题。
先谢谢 拉朱
答案 0 :(得分:3)
您的容器不仅仅是List
。 List
是一个可以通过ArrayList
和LinkedList
实现的界面。性能取决于哪些底层类实际上是为多边形引用的对象实例化的List
。
ArrayList
可以快速访问列表中间的元素,但是如果删除其中一个元素,则需要移动一大堆元素。 LinkedList
在这方面是相反的。需要迭代访问,但删除只是重新分配指针的问题。
您的表现取决于List
的实施,并且最佳实施选择取决于您将如何使用列表以及哪些操作最常见。
答案 1 :(得分:1)
Collections2.filter
(来自Guava)根据谓词生成过滤后的集合。
List<Number> myNumbers = Arrays.asList(Integer.valueOf(1), Double.valueOf(1e6));
Collection<Number> bigNumbers = Collections2.filter(
myNumbers,
new Predicate<Number>() {
public boolean apply(Number n) {
return n.doubleValue() >= 100d;
}
});
请注意,某些操作(如size()
)对此方案效率不高。如果你倾向于遵循Josh Bloch的建议并且更喜欢isEmpty()
和迭代器来进行不必要的size()
检查,那么这不应该在实践中咬你。
答案 2 :(得分:1)
如果您要迭代列表并对每个元素应用测试,那么LinkedList
在CPU时间方面效率最高,因为您不必转移列表中的任何元素。但是,它会消耗比ArrayList
更多的内存,因为每个列表元素实际上都保存在一个条目中。
然而,这可能无关紧要。 100,000是一个很小的数字,如果你没有删除很多元素,转移ArrayList
的成本会很低。如果要删除大量元素,最好将其重组为带副本的过滤器。
然而,唯一真正知道的方法是编写代码并对其进行基准测试。
答案 3 :(得分:0)
LinkedList 可能是个不错的选择。
LinkedList“删除并添加元素”比ArrayList更有效。并且无需调用ArrayList.trimToSize()
之类的方法来删除无用的内存。但是LinkedList是一个双链表,每个元素都被包装成一个需要额外内存的Entry。