Java Collections
Non-concurrent collection classes from java.util.
At a Glance
ArrayList— Resizable array. O(1) random access, O(1) amortized append. Default choice for most list needs. Inserts/removes in the middle are O(n) due to shifting.LinkedList— Doubly-linked list that also implementsDeque. O(1) insert/remove at ends or via iterator, but O(n) random access. Rarely better thanArrayListin practice due to cache locality.HashSet— Unordered set backed byHashMap. O(1) add/remove/contains. Default choice for sets. No ordering guarantees.LinkedHashSet—HashSetthat maintains insertion order. Slightly more memory thanHashSet. Use when you need deterministic iteration order.TreeSet— Sorted set backed by a red-black tree. O(log n) operations. Use when you need elements in sorted order or range queries (headSet,tailSet). No nulls.EnumSet— Specialized set for enum types, backed by a bit vector. Extremely fast and compact. Always prefer overHashSetwhen keys are enums.HashMap— Unordered key-value map. O(1) get/put. Default choice for maps. Allows one null key. Buckets convert to tree bins at threshold 8 for worst-case O(log n).LinkedHashMap—HashMapwith insertion-order (or access-order) iteration. Use for predictable iteration or LRU caches viaremoveEldestEntry.TreeMap— Sorted map backed by a red-black tree. O(log n) operations. Use when you need sorted keys or range views (subMap,headMap). No null keys.EnumMap— Map with enum keys, backed by a plain array. Very fast and compact. Always prefer overHashMapwhen keys are enums.IdentityHashMap— Uses==instead ofequals()for key comparison. Rare — useful for topology-preserving object graph operations like serialization.WeakHashMap— Entries are garbage-collected when keys have no strong references. Use for memory-sensitive caches. Not thread-safe.ArrayDeque— Resizable-array double-ended queue. O(1) amortized push/pop at both ends. Preferred overStackandLinkedListfor stack and queue use.PriorityQueue— Min-heap. O(log n) insert/remove, O(1) peek. Use for priority-based processing. Not thread-safe — usePriorityBlockingQueuefor concurrency.
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. |