Difference between implicit and explicit ArrayList size declarations?

Here is the source code for you for first example

public  ArrayList() {
    this(10);
 }

So there is no difference. Since the initial capacity is 10, no matter you pass 10 or not, it gets initialised with capacity 10.

Can I add 11th element in the list2 by list2.add("something")?

Ofcourse, initial capacity is not final capacity. So as you keep on adding more than 10, the size of the list keeps increasing.

If you want to have a fixed size container, use Arrays.asList (or, for primitive arrays, the asList methods in Guava) and also consider java.util.Collections.unmodifiableList()

Worth reading about this change in Java 8 : In Java 8, why is the default capacity of ArrayList now zero?

In short, providing initial capacity wont really change anything interms of size.


You can always add elements in a list. However, the inlying array, which is used by the ArrayList, is initialized with either the default size of 10 or the size, which you specify when initializing the ArrayList. This means, if you e.g. add the 11th element, the array size has to be increased, which is done by copying the contents of the array to a new, bigger array instance. This of course needs time depending on the size of the list/array. So if you already know, that your list will hold thousands of elements, it is faster if you already initialize the list with that approximate size.


ArrayLists in Java are auto-growable, and will resize themselves if they need to in order to add additional elements. The size parameter in the constructor is just used for the initial size of the internal array, and is a sort of optimization for when you know exactly what you're going to use the array for.

Specifying this initial capacity is often a premature optimization, but if you really need an ArrayList of 10 elements, you should specify it explicitly, not assume that the default size is 10. Although this really used to be the default behavior (up to JDK 7, IIRC), you should not rely on it - JDK 8 (checked with java-1.8.0-openjdk-1.8.0.101-1.b14.fc24.x86_64 I have installed) creates empty ArrayLists by default.