Why is ArrayDeque better than LinkedList
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.
Introduction
In Java, ArrayDeque is usually a better default than LinkedList when you need a queue, stack, or deque. Both support insertion and removal at the ends, but ArrayDeque tends to win in practice because it uses contiguous storage, creates less object overhead, and interacts with CPU caches more efficiently.
Same big-O, different real performance
For end operations, both structures offer effectively constant-time behavior:
- add to front or back
- remove from front or back
- peek at front or back
So the usual reason to prefer ArrayDeque is not asymptotic complexity. It is constant factors and memory behavior.
ArrayDeque stores data more compactly
ArrayDeque uses a resizable circular array. That means the elements live in a contiguous block of memory.
LinkedList stores each element in a separate node object, and each node also keeps references to its neighbors.
That creates extra overhead:
- more object allocations
- more pointer fields
- more garbage collection pressure
For ordinary queue workloads, that overhead usually buys you nothing useful.
Better cache locality
Contiguous arrays are friendlier to CPU caches than linked nodes scattered through memory. When iterating or repeatedly pushing and popping near the ends, ArrayDeque often benefits from better locality and fewer pointer hops.
This is one of the main reasons it tends to outperform LinkedList even when both have similar theoretical operation costs.
Example queue usage
For stack-style usage:
These are exactly the common use cases where ArrayDeque shines.
Why LinkedList is rarely the better queue
LinkedList is still valid Java, but it is usually not the best deque implementation unless you have a specific reason to need list-node semantics.
For example:
- if you need random indexed access, neither is ideal
- if you need a queue or stack,
ArrayDequeis usually the better default - if you specifically need list operations with node-like insertion patterns,
LinkedListmay still be relevant
Most code that uses LinkedList as a queue could switch to ArrayDeque and become simpler and faster.
ArrayDeque also forbids null
One useful design difference is that ArrayDeque does not allow null elements. That helps avoid ambiguity between:
- an actual stored value
- a sentinel meaning "no element"
For queue and stack code, that is often a feature rather than a limitation.
Resizing is usually not a problem
ArrayDeque can occasionally resize its internal array, which costs more than a normal push or pop. But this overhead is amortized and usually far cheaper than paying per-element linked-node overhead for the whole lifetime of the structure.
So while LinkedList does not resize a backing array, it often still loses overall due to poorer memory behavior.
Common Pitfalls
The most common mistake is comparing only big-O notation and concluding that LinkedList and ArrayDeque are interchangeable in practice. Another is choosing LinkedList as a queue just because it sounds like a structure built for insertions and removals. Developers also sometimes forget that ArrayDeque rejects null, which can break code that uses null as a sentinel. Using either structure when an entirely different abstraction is needed, such as a priority queue, is another common design error. Finally, people often benchmark tiny examples and miss how memory layout and allocation overhead dominate on larger real workloads.
Summary
- '
ArrayDequeis usually the best default for Java queue, stack, and deque workloads.' - It uses a compact circular array instead of allocating linked nodes per element.
- Better cache locality and lower object overhead usually make it faster than
LinkedList. - '
LinkedListis rarely the better queue unless you need specific list-oriented behavior.' - '
ArrayDequedoes not allownull, which often improves API clarity.' - Prefer
ArrayDequeunless you have a concrete reason not to.
Related reading
- Why is Array.Length an int, and not an uint
- Why is builtin sorted slower for a list containing descending numbers if each number appears twice consecutively?
- Why is DFS slower in one tree and faster in the other?
- Why is Dictionary preferred over Hashtable in C#?
- Why is Double.MIN_VALUE in not negative
- Why is executing Java code in comments with certain Unicode characters allowed?
- Why is Dictionary preferred over Hashtable in C?
- Why is dictionary so much faster than list?

DSA Fundamentals
Master algorithmic patterns and data structures through hands-on LeetCode-style problems - from arrays and hashing to dynamic programming and advanced graphs.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.