You can use one over the other based on the time complexities of the operations that you'd perform on that particular List.
|---------------------|---------------------|--------------------|------------|| Operation | ArrayList | LinkedList | Winner ||---------------------|---------------------|--------------------|------------|| get(index) | O(1) | O(n) | ArrayList || | | n/4 steps in avg | ||---------------------|---------------------|--------------------|------------|| add(E) | O(1) | O(1) | LinkedList || |---------------------|--------------------| || | O(n) in worst case | | ||---------------------|---------------------|--------------------|------------|| add(index, E) | O(n) | O(n) | LinkedList || | n/2 steps | n/4 steps | || |---------------------|--------------------| || | | O(1) if index = 0 | ||---------------------|---------------------|--------------------|------------|| remove(index, E) | O(n) | O(n) | LinkedList || |---------------------|--------------------| || | n/2 steps | n/4 steps | ||---------------------|---------------------|--------------------|------------|| Iterator.remove() | O(n) | O(1) | LinkedList || ListIterator.add() | | | ||---------------------|---------------------|--------------------|------------||--------------------------------------|-----------------------------------|| ArrayList | LinkedList ||--------------------------------------|-----------------------------------|| Allows fast read access | Retrieving element takes O(n) ||--------------------------------------|-----------------------------------|| Adding an element require shifting | o(1) [but traversing takes time] || all the later elements | ||--------------------------------------|-----------------------------------|| To add more elements than capacity || new array need to be allocated ||--------------------------------------|