Best way to remove and add elements from the java List
I have 100,000 objects in the list .I want to remove few elements from the list based on condition.Can anyone tell me what is the best approach to achieve interms of memory and performance.
Same question for add开发者_运维百科ing objects also based on condition.
Thanks in Advance Raju
Your container is not just a List
. List
is an interface that can be implemented by, for example ArrayList
and LinkedList
. The performance will depend on which of these underlying classes is actually instantiated for the object you are polymorphically referring to as List
.
ArrayList
can access elements in the middle of the list quickly, but if you delete one of them you need to shift a whole bunch of elements. LinkedList
is the opposite i nthis respect., requiring iteration for the access but deletion is just a matter of reassigning pointers.
Your performance depends on the implementation of List
, and the best choice of implementation depends on how you will be using the List and which operations are most frequent.
If you're going to be iterating a list and applying tests to each element, then a LinkedList
will be most efficient in terms of CPU time, because you don't have to shift any elements in the list. It will, however consume more memory than an ArrayList
, because each list element is actually held in an entry.
However, it might not matter. 100,000 is a small number, and if you aren't removing a lot of elements the cost to shift an ArrayList
will be low. And if you are removing a lot of elements, it's probably better to restructure as a copy-with filter.
However, the only real way to know is to write the code and benchmark it.
Collections2.filter
(from Guava) produces a filtered collection based on a predicate.
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;
}
});
Note, that some operations like size()
are not efficient with this scheme. If you tend to follow Josh Bloch's advice and prefer isEmpty()
and iterators to unnecessary size()
checks, then this shouldn't bite you in practice.
LinkedList could be a good choice.
LinkedList does "remove and add elements" more effective than ArrayList. and no need to call such method as ArrayList.trimToSize()
to remove useless memory. But LinkedList is a dual-linked list, each element is wrapped as an Entry which needs extra memory.
精彩评论