Engineering Full Stack Apps with Java and JavaScript
ArrayList is a resizable-array implementation of the List interface.
In the newer code, ArrayList is used along with generics.
The ArrayList class is similar to a Vector as both can grow in size as needed.
But unlike Vector, ArrayList is not synchronized.
ArrayList is always preferred over a Vector.
There are many ways through which we can make an ArrayList thread safe like Collections.synchronizedList(theArrayList) or we can use a use a CopyOnWriteArrayList.
iterators returned by iterator and listIterator methods of LinkedList are fail-fast:
fails quickly and cleanly, rather than risking undetermined behaviour in the future.
if the list is structurally modified at any time after the iterator is created, except through the Iterator's own remove or add methods, the iterator will throw a ConcurrentModificationException.
Fail-fast iterators throw ConcurrentModificationException on a best-effort basis and cannot be guaranted; so we should not depend on it while coding.
If simultaneous overwrite occurs in an ArrayList, a ConcurrentModificationException exception is thrown.
Synchronizing a class when not required can affect the performance.
The list in an ArrayList is internally stored using arrays. The capacity attribute of an ArrayList is the size of the array used to store the elements in the list. It is always at least as large as the list size. As elements are added to an ArrayList, its capacity grows automatically. Internally a new array may be created and elements are copied from the old array to the new array. The details of the growth policy are however not specified in the specification. Anyway, when we spread out the time taken over the total number of operations, it will not be significant.
ArrayList can be considered as dynamic arrays and had following advantages over arrays:
ArrayList can dynamically resize based on the number of elements in the list, but arrays have a fixed size.
It reduces the memory footprint. In case of arrays, we need to allocate memory upfront as we cannot change later. So extra memory is allocated even if we don't use it.
However, if you are sure about the number of elements or if primitive data types are the elements we can use arrays instead.
ArrayList is part of the collections framework.
ArrayList is implements List<E> interface.
ArrayList implements all optional list operations, and permits all elements, including null.
In addition to implementing the List interface, this class provides methods to manipulate the size of the internal array that is used to store the list.
ArrayList also implements following interfaces: Serializable, Cloneable, Iterable<E>, Collection<E>, RandomAccess.
ArrayList extends from following abstract classes: AbstractList<E> and AbstractList<E>.
ArrayList has following subclasses: AttributeList, RoleList, RoleUnresolvedList
Comments
The diamond syntax
when constructing an ArrayList, we can use the diamond syntax. instead of
ArrayList<String> list = new ArrayList<String>();
ArrayList<String> list = new ArrayList<String>(20);
ArrayList<String> list = new ArrayList<String>(myCollection);
we can use
ArrayList<String> list = new ArrayList<>();
ArrayList<String> list = new ArrayList<>(20);
ArrayList<String> list = new ArrayList<>(myCollection);
this is called the diamond syntax probably because of the <>(), note that the data type is ommitted on the right of the equal sign.