ArrayList — array-based, fast access. LinkedList — node-based, fast insert/delete.
Analogy: ArrayList = numbered parking lot. LinkedList = treasure hunt chain.
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:8new ArrayList<>(10000);910// Search:11list.contains("Alice");12list.indexOf("Bob");
LinkedList:
1LinkedList<String> linked = new LinkedList<>();2linked.add("Alice"); // O(1)3linked.addFirst("Bob"); // O(1)4String s = linked.get(2); // O(n)5linked.removeFirst(); // O(1)67// Deque:8linked.push("item");9linked.pop();10linked.offer("item");11linked.poll();
Complexity:
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 knownUse ArrayList for random access (99% of cases). Use LinkedList for queue/deque.