Java Collections

Non-concurrent collection classes from java.util.

At a Glance

List

Ordered, index-accessible sequences. Duplicates allowed.

Class Backed by get(i) add (end) add (mid) remove (mid) Notes
ArrayList Resizable array O(1) O(1)* O(n) O(n) Default choice. * amortized; resize copies array.
LinkedList Doubly-linked list O(n) O(1) O(1)** O(1)** Also implements Deque. ** O(1) with iterator; O(n) by index.
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.get(0);           // "Alice"
names.set(1, "Charlie");
names.remove(0);        // removes "Alice"

// Immutable (Java 9+)
List<String> fixed = List.of("a", "b", "c");

// Immutable copy (Java 10+)
List<String> copy = List.copyOf(names);

Set

Unique elements. No duplicate values.

Class Order add contains remove Nulls? Notes
HashSet None O(1) O(1) O(1) Yes (one) Default choice. Backed by HashMap.
LinkedHashSet Insertion O(1) O(1) O(1) Yes (one) Maintains insertion order via linked list.
TreeSet Sorted (natural / comparator) O(log n) O(log n) O(log n) No Implements NavigableSet. Red-black tree.
EnumSet Enum declaration O(1) O(1) O(1) No Bit-vector backed. Extremely fast for enum types.
Set<String> tags = new HashSet<>();
tags.add("java");
tags.add("collections");
tags.add("java");       // ignored — already present
tags.contains("java");  // true
tags.size();             // 2

// Immutable (Java 9+)
Set<String> fixed = Set.of("a", "b", "c");

// From enum
EnumSet<DayOfWeek> weekend = EnumSet.of(SATURDAY, SUNDAY);

Map

Key-value pairs. Keys are unique.

Class Order put get remove Null key? Notes
HashMap None O(1) O(1) O(1) Yes (one) Default choice. Buckets → tree bins at threshold 8.
LinkedHashMap Insertion (or access) O(1) O(1) O(1) Yes (one) Access-order mode useful for LRU caches.
TreeMap Sorted by key O(log n) O(log n) O(log n) No Implements NavigableMap. Red-black tree.
EnumMap Enum declaration O(1) O(1) O(1) No (enum keys only) Array-backed. Very fast when keys are enums.
IdentityHashMap None O(1) O(1) O(1) Yes Uses == instead of equals(). Rare, specialized use.
WeakHashMap None O(1) O(1) O(1) Yes Entries GC'd when key has no strong refs. Good for caches.
Map<String, Integer> scores = new HashMap<>();
scores.put("Alice", 95);
scores.put("Bob", 87);
scores.get("Alice");                     // 95
scores.getOrDefault("Eve", 0);           // 0
scores.putIfAbsent("Bob", 100);          // no-op, key exists
scores.computeIfAbsent("Eve", k -> 42); // adds Eve=42

// Iteration
scores.forEach((k, v) -> System.out.println(k + ": " + v));

// Immutable (Java 9+)
Map<String, Integer> fixed = Map.of("a", 1, "b", 2);

// LRU cache via LinkedHashMap
Map<K, V> lru = new LinkedHashMap<>(16, 0.75f, true) {
    protected boolean removeEldestEntry(Map.Entry<K, V> e) {
        return size() > MAX_SIZE;
    }
};

Queue & Deque

FIFO queues and double-ended queues.

Class Type offer poll peek Notes
ArrayDeque Deque (resizable array) O(1)* O(1) O(1) Preferred over Stack and LinkedList for stack/queue use. * amortized.
PriorityQueue Min-heap O(log n) O(log n) O(1) Natural ordering or custom Comparator. Not thread-safe.
// Stack (LIFO) — use ArrayDeque, not java.util.Stack
Deque<String> stack = new ArrayDeque<>();
stack.push("first");
stack.push("second");
stack.pop();   // "second"
stack.peek();  // "first"

// Queue (FIFO)
Queue<String> queue = new ArrayDeque<>();
queue.offer("first");
queue.offer("second");
queue.poll();  // "first"

// Priority queue (min-heap)
Queue<Integer> pq = new PriorityQueue<>();
pq.offer(30);
pq.offer(10);
pq.offer(20);
pq.poll();  // 10 — smallest first

// Max-heap
Queue<Integer> maxPQ = new PriorityQueue<>(Comparator.reverseOrder());

Legacy Collections

Synchronized-by-default classes from Java 1.0/1.2. Avoid in new code.

Class Modern Replacement Why Avoid
Vector ArrayList (or Collections.synchronizedList) Synchronized on every operation — unnecessary overhead when single-threaded.
Stack ArrayDeque Extends Vector. Exposes index-based access that breaks stack semantics.
Hashtable HashMap (or ConcurrentHashMap) Synchronized on every operation. Does not allow null keys or values.

Interface Hierarchy

Iterable
 └── Collection
      ├── List       → ArrayList, LinkedList
      ├── Set        → HashSet, LinkedHashSet, TreeSet, EnumSet
      │    └── SortedSet → NavigableSet → TreeSet
      └── Queue      → PriorityQueue, ArrayDeque
           └── Deque → ArrayDeque

Map (separate hierarchy)
 ├── HashMap, LinkedHashMap, WeakHashMap, IdentityHashMap, EnumMap
 └── SortedMap → NavigableMap → TreeMap

Unmodifiable & Factory Methods

API Since Behavior
Collections.unmodifiableList(list) 1.2 Unmodifiable view — changes to backing list are visible.
List.of(...), Set.of(...), Map.of(...) 9 Truly immutable. No nulls. Throw on mutation.
List.copyOf(coll), Set.copyOf(coll), Map.copyOf(map) 10 Immutable copy. No nulls.
Collections.unmodifiableSequencedCollection(coll) 21 Unmodifiable view of sequenced collections.