[英]Best way to remove and add elements from the java List
我的列表中有100,000個對象。我想根據條件從列表中刪除一些元素。誰能告訴我實現內存和性能的最佳方法是什么。
同樣根據條件添加對象的問題。
在此先感謝Raju
您的容器不僅僅是一個List
。 List
是可以由ArrayList
和LinkedList
實現的接口。 性能取決於為多態引用為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.