OLHub

Generics & Collections

Generics, type erasure, wildcard (? extends, ? super), PECS rule, Collections framework (List, Set, Map), khi nào chọn ArrayList vs LinkedList vs HashMap vs TreeMap.

10 bài · ~214 phútMiễn phí

Nội dung

Danh sách bài học

  1. 01

    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.

    ~18 phút
  2. 02

    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.

    ~18 phút
  3. 03

    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<?>.

    ~18 phút
  4. 04

    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.

    ~22 phút
  5. 05

    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.

    ~22 phút
  6. 06

    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.

    ~22 phút
  7. 07

    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+.

    ~22 phút
  8. 08

    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ự.

    ~20 phút
  9. 09

    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.

    ~22 phút
  10. 10

    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.

    ~30 phút