I was assuming LinkedList.Clear() was O(1) on a project I'm working on, as I used a LinkedList to drain a BlockingQueue in my consumer that needs high throughput, clearing and reusing the LinkedList afterwards.
Turns out that assumption was wrong, as the (OpenJDK) code does this:
Entry<E> e = header.next; while (e != header) { Entry<E> next = e.next; e.next = e.previous = null; e.element = null; e = next; }
This was a bit surprising, are there any good reason LinkedList.Clear couldn't simply "forget" its header.next and header.previous member ?
A LinkedList consists of a chain of nodes; each node is separated allocated. And so while inserting, it's not necessary to traverse all the nodes. And that's why it has the complexity O(1) .
For example, Time Complexity to insert element at front is O(1) in Singly Linked List but it is O(√N) for Doubly Linked List as we have to access the next element to set its previous address to the new element.
An LinkedList can be cleared in Java using the method java. util. LinkedList. clear().
By default, an creates a list of initial capacity 10, while LinkedList only constructs an empty list without any initial capacity.
The source code in the version I'm looking at (build 1.7.0-ea-b84) in Eclipse have this comment above them:
// Clearing all of the links between nodes is "unnecessary", but: // - helps a generational GC if the discarded nodes inhabit // more than one generation // - is sure to free memory even if there is a reachable Iterator
That makes it reasonably clear why they're doing it, although I agree it's slightly alarming that it turns an O(1) operation into O(n).
while I'm not very impressed with the reason of GC optimization - it clearly backfires in your case -
clearing and reusing the LinkedList
that does not sound right. why not just create a brand new LinkedList object?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With