Nội dung
Danh sách bài học
- 01~18 phút
Generics cơ bản — class và method nhận kiểu làm tham số
Vì sao cần generics, cú pháp class/method generic, type parameter T, bounded type parameter (T extends Comparable), và ví dụ tự viết generic collection đơn giản.
- 02~18 phút
Type erasure — sự thật không dễ chịu của generics Java
Generics Java bị erase lúc compile, bytecode không biết T là gì; hệ quả: không new T(), không instanceof T, không catch T, heap pollution, và vì sao List<String> + List<Integer> cùng bytecode.
- 03~18 phút
Wildcard `? extends`, `? super` — PECS rule
Invariance của generics, upper bound wildcard, lower bound wildcard, rule PECS (Producer Extends Consumer Super) của Effective Java, và unbounded wildcard List<?>.
- 04~22 phút
List và Queue — ArrayList, LinkedList, ArrayDeque, PriorityQueue
Memory layout chi tiết của ArrayList (array liền kề, cache-friendly) vs LinkedList (node rải rác, cache miss). ArrayDeque circular buffer. PriorityQueue binary heap. Vì sao Big-O không nói hết câu chuyện.
- 05~22 phút
Map và Set — HashMap, TreeMap, HashSet bên dưới
HashMap bucket + chaining + treeify (JEP 180), TreeMap red-black tree, HashSet/LinkedHashSet/TreeSet wrap Map với dummy value. LinkedHashMap cho LRU cache. Load factor, resize, và vai trò equals/hashCode.
- 06~22 phút
Iterator, fail-fast và ConcurrentModificationException — vì sao remove trong for-each crash
Cơ chế modCount/expectedModCount bên trong ArrayList, vì sao for-each enhanced crash khi gọi list.remove(), 4 cách remove an toàn, và bẫy fail-fast không phải thread-safety guarantee.
- 07~22 phút
Comparator và Comparable — vì sao Java cần 2 interface sắp xếp
Contract compareTo/compare, pitfall tràn số với a-b, NaN trong Double, inconsistency với equals trong TreeSet/TreeMap, và Comparator fluent API Java 8+.
- 08~20 phút
Immutable Collections — List.of, Map.copyOf và cạm bẫy unmodifiableList
Ba cách tạo immutable collection trong Java 9+, shallow vs deep immutability, defensive copy pattern, và vì sao Collections.unmodifiableList không phải immutable thực sự.
- 09~22 phút
Bounded Types và Generic Invariance — vì sao List<Integer> không phải List<Number>
Upper bounded type parameters, multiple bounds, generic invariance vs array covariance, workaround qua wildcard, và cách JVM xử lý erasure đến bound thay vì Object.
- 10~30 phút
Mini-challenge: LRU Cache generic với LinkedHashMap
Bài thực hành khép lại Module 8 — xây LruCache<K, V> generic dựa trên LinkedHashMap(accessOrder=true), thread-safe version với ReentrantLock, benchmark so sánh.