77

Is ArrayList an array or a list in java? what is the time complexity for the get operation, is it O(n) or O(1)?

6 Answers 6

127

An ArrayList in Java is a List that is backed by an array.

The get(index) method is a constant time, O(1), operation.

The code straight out of the Java library for ArrayList.get(index):

public E get(int index) {
    RangeCheck(index);
    return (E) elementData[index];
}

Basically, it just returns a value straight out of the backing array. (RangeCheck(index)) is also constant time)

Sign up to request clarification or add additional context in comments.

1 Comment

It is constant time because array[n]----means that the system will just do a mathematical calculation= offsetvalue + (size of Variable)*n. so this whole calculation will happen in processor without accessing the memory locations again and again.that is why it is O(1)
25

It's implementation is done with an array and the get operation is O(1).

javadoc says:

The size, isEmpty, get, set, iterator, and listIterator operations run in constant time. The add operation runs in amortized constant time, that is, adding n elements requires O(n) time. All of the other operations run in linear time (roughly speaking). The constant factor is low compared to that for the LinkedList implementation.

1 Comment

12

As everyone has already pointed out, read operations are constant time - O(1) but write operations have the potential to run out of space in the backing array, re-allocation, and a copy - so that runs in O(n) time, as the doc says:

The size, isEmpty, get, set, iterator, and listIterator operations run in constant time. The add operation runs in amortized constant time, that is, adding n elements requires O(n) time. All of the other operations run in linear time (roughly speaking). The constant factor is low compared to that for the LinkedList implementation.

In practice everything is O(1) after a few adds, since the backing array is doubled each time it's capacity is exhausted. So if the array starts at 16, gets full, it's reallocated to 32, then 64, 128, etc. so it scales okay, but GC can hit up during a big realloc.

8 Comments

It's a little off-topic, but I would hate for someone to get confused and not really notice the emphasis on get operations.
In the JDK code I'm looking at (1.6.0_17) the new capacity is actually calculated as (oldCapacity * 3)/2 + 1.
Quibble about the first sentence, which seems to imply that write operations run in O(n) time. That's not what the doc says, it says that adding n elements requires O(n). For individual elements, insertion time is still O(1). The re-allocation, copy etc. just make it a somewhat "bigger" O(1).
You can avoid the expansion steps if you tell the constructor how big it should be from the beginning. (if you know)
@AKh, yeah, which is why it says amortized constant time. Most insertions will be O(1), but every now and then they will be O(n). Taken as a whole, insertions will behave as O(1).
|
5

To be pedantic, it's a List backed by an array. And yes, the time complexity for get() is O(1).

Comments

1

Just a Note.

The get(index) method is a constant time, O(1)

But that's the case if we know the index. If we try to get the index using indexOf(something), that will cost O(n)

1 Comment

`Getting indexOf for some element is O(n) anyway.
0

The arraylist is basically an implementation of array. so the time complexity of the CRUD operations on it would be :

get/read :  O(1) since you can seek the address directly from base

remove/delete : O(n) why ? Because once we delete the element at index, then we need to move the after values one by one to the left. 

add : O(1) becuase you always add the end of the array - next free address available.

update : O(1) since you are just changing the value but nothing value moving....across the array.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.