Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why isn't LinkedList.Clear() O(1)

Tags:

java

big-o

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 ?

like image 624
Leri Avatar asked Mar 01 '11 22:03

Leri


People also ask

Why does LinkedList delete and insert operation have complexity of O 1 )?

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) .

Which LinkedList operation is having complexity of 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.

How do you clear a LinkedList in Java?

An LinkedList can be cleared in Java using the method java. util. LinkedList. clear().

What is default capacity of LinkedList?

By default, an creates a list of initial capacity 10, while LinkedList only constructs an empty list without any initial capacity.


2 Answers

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).

like image 102
Jon Skeet Avatar answered Oct 20 '22 18:10

Jon Skeet


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?

like image 21
irreputable Avatar answered Oct 20 '22 17:10

irreputable