CS205

ArrayList vs LinkedList

Compare the internal structure, performance characteristics, and use cases of ArrayList and LinkedList to make informed data structure choices.

Structural Comparison

ArrayList

Storage:Contiguous array in memory
Memory:Elements only (+ capacity overhead)
Access:Direct via index calculation
Growth:Doubles capacity when full
10
20
30
40

LinkedList

Storage:Scattered nodes in memory
Memory:Elements + pointers per node
Access:Sequential traversal required
Growth:Add nodes as needed
head→
10
20
30
40
→null
Time Complexity Comparison
OperationArrayListLinkedListWinner
get(index)O(1)O(n)
set(index, value)O(1)O(n)
addFirst(value)O(n)O(1)
addLast(value)O(1)*O(1)Tie
add(middle, value)O(n)O(n)Tie**
removeFirst()O(n)O(1)
removeLast()O(1)O(1)***Tie
Memory per element~4-8 bytes~24-40 bytes

* O(1) amortized - occasionally O(n) when resizing

** LinkedList is faster for the actual insertion, but both require O(n) to find the position

*** O(1) for doubly-linked list, O(n) for singly-linked list

Interactive Performance Demo

Click an operation to see a simulated comparison of how many steps each data structure needs (assuming 1000 elements).

When to Use Which?

Choose ArrayList when...

  • You need frequent random access (get/set by index)
  • Most additions are at the end (append operations)
  • Memory efficiency is important
  • You iterate through elements frequently
  • You know the approximate size upfront
Common use cases: Storing data for display, caching, implementing dynamic arrays, sorting algorithms

Choose LinkedList when...

  • You need frequent insertions/deletions at the beginning
  • You need a queue or deque (double-ended queue)
  • Insertions/deletions at known positions (with iterator)
  • You don't need random access
  • Size changes dramatically and unpredictably
Common use cases: Implementing stacks, queues, undo/redo functionality, LRU caches, task scheduling
Memory Usage Comparison

For storing 1000 integers (assuming 64-bit JVM):

ArrayList

  • Object header: ~16 bytes
  • Array reference: ~8 bytes
  • Size field: ~4 bytes
  • Array: 1000 × 4 = 4,000 bytes
  • Total: ~4,028 bytes

LinkedList (Doubly)

  • List header: ~24 bytes
  • Per node: ~40 bytes each
  • 1000 nodes: 1000 × 40 = 40,000 bytes
  • Total: ~40,024 bytes

Key insight: LinkedList uses approximately 10x more memory than ArrayList for the same data. Each node carries overhead for object headers and two pointers.

Quick Reference Summary
CriteriaBest ChoiceReason
Random access by indexArrayListO(1) vs O(n)
Insert at beginningLinkedListO(1) vs O(n)
Insert at endEitherBoth O(1)
Delete from beginningLinkedListO(1) vs O(n)
Memory efficiencyArrayList~10x less memory
Iteration speedArrayListBetter cache locality
Queue/Deque operationsLinkedListO(1) at both ends