簡體   English   中英

從Java列表中刪除和添加元素的最佳方法

[英]Best way to remove and add elements from the java List

我的列表中有100,000個對象。我想根據條件從列表中刪除一些元素。誰能告訴我實現內存和性能的最佳方法是什么。

同樣根據條件添加對象的問題。

在此先感謝Raju

您的容器不僅僅是一個List List是可以由ArrayListLinkedList實現的接口。 性能取決於為多態引用為List的對象實際實例化的是這些基礎類中的哪一個。

ArrayList可以快速訪問列表中間的元素,但是如果刪除其中一個元素,則需要移動一大堆元素。 在此方面, LinkedList與之相反,需要進行訪問迭代,但是刪除僅是重新分配指針的問題。

您的性能取決於List的實現,實現的最佳選擇取決於您將如何使用List以及最常使用哪些操作。

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()檢查,那么這實際上就不會對您造成傷害。

如果要迭代一個列表並將測試應用於每個元素,則在CPU時間方面, LinkedList將是最有效的,因為您不必移動列表中的任何元素。 但是,它將消耗比ArrayList更多的內存,因為每個列表元素實際上都保存在一個條目中。

但是,這可能並不重要。 100,000是一個很小的數字,如果您不刪除很多元素,則移動ArrayList的成本將很低。 而且,如果要刪除很多元素,最好將其重組為帶復制的過濾器。

但是,唯一真正知道的方法是編寫代碼並對其進行基准測試。

LinkedList可能是一個不錯的選擇。

LinkedList確實比ArrayList更有效地“ 刪除和添加元素 ”。 無需調用ArrayList.trimToSize()這樣的方法即可刪除無用的內存。 但是LinkedList是一個雙鏈表,每個元素都包裝為Entry,這需要額外的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM