ArrayList — array-backed, fast access. LinkedList — node-backed, fast insert/delete at ends.
Analogy: ArrayList = numbered parking lot (drive to spot #50). LinkedList = treasure hunt (follow chain to 50th item).
ArrayList:
1ArrayList<String> list = new ArrayList<>();2list.add("Alice"); // O(1)3list.add(1, "Bob"); // O(n)4String s = list.get(2); // O(1)5list.remove(0); // O(n)67// Pre-size:8ArrayList<Integer> big = new ArrayList<>(10000);910// Search:11list.contains("Alice"); // O(n)12list.indexOf("Bob"); // O(n)
LinkedList:
1LinkedList<String> linked = new LinkedList<>();2linked.add("Alice"); // O(1) tail3linked.addFirst("Bob"); // O(1) head4String s = linked.get(2); // O(n)5linked.removeFirst(); // O(1)6linked.removeLast(); // O(1)78// Deque:9linked.push("item"); // O(1)10linked.pop(); // O(1)11linked.offer("item"); // O(1)12linked.poll(); // O(1)
Comparison:
get(i): ArrayList O(1), LinkedList O(n)add(end): Both O(1)add(middle): ArrayList O(n), LinkedList O(1) if node knownremove(middle): ArrayList O(n), LinkedList O(1) if node knownWhen to use:
Common mistake: Choosing LinkedList for index access — ArrayList is almost always faster.