从java List中删除和添加元素的最佳方法

时间:2011-01-06 22:19:37

标签: java

我在列表中有100,000个对象。我想根据条件从列表中删除一些元素。任何人都可以告诉我实现内存和性能的最佳方法是什么。

同样基于条件添加对象的问题。

先谢谢 拉朱

4 个答案:

答案 0 :(得分:3)

您的容器不仅仅是ListList是一个可以通过ArrayListLinkedList实现的界面。性能取决于哪些底层类实际上是为多边形引用的对象实例化的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。