Learning Outcome & Exercises: Java Core
Tổng kết chương Java Core: học xong mình phải làm được gì, và làm bài tập nào để chứng minh?
Đọc hiểu chưa đủ để đi phỏng vấn. Mỗi chương kết thúc bằng những việc làm được và chứng minh được: có code chạy, có test cho cả trường hợp lỗi, có log hoặc số đo. Bài tập nằm trong repo riêng java-backend-interview-labs, thư mục labs/java-core.
1. Mục tiêu đầu ra
Học xong chương này, bạn tự làm được:
- Giải thích và chứng minh bằng test vì sao một class vi phạm equals/hashCode làm HashMap mất phần tử.
- Chọn đúng collection theo access pattern và nói được độ phức tạp của thao tác chính.
- Refactor một đoạn code vi phạm SOLID thành thiết kế dùng interface + strategy, có test giữ nguyên hành vi.
- Dùng generics có bounded wildcard (PECS) mà không cần cast.
2. Basic: equals/hashCode và HashMap
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Viết class Money(amount, currency) sai equals/hashCode, tái hiện việc map.get() trả null; sửa bằng record và chứng minh bằng JUnit.
Bài liên quan: equals, hashCode, HashMap bên trong, Collections: chọn cấu trúc nào
Hoàn thành khi:
- Có test fail với bản sai và pass với bản đúng
- README giải thích bucket và vì sao hashCode phải nhất quán với equals
3. Intermediate: Refactor theo SOLID
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Cho PriceCalculator có chuỗi if/else theo loại khách hàng; tách thành Strategy + registry, thêm loại khách mới mà không sửa class cũ.
Bài liên quan: OOP & SOLID, Interface vs abstract class, Design patterns hay hỏi
Hoàn thành khi:
- Test hành vi trước/sau refactor giống nhau
- Thêm 1 strategy mới chỉ bằng 1 class mới
4. Challenge: Generic cache có giới hạn
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Viết LruCache<K, V> dựa trên LinkedHashMap, có copyAll(Map<? extends K, ? extends V>), đo get/put O(1) với 1 triệu phần tử.
Bài liên quan: Generics, Map, Set, Heap bên trong, Big-O & độ phức tạp
Hoàn thành khi:
- Test eviction đúng thứ tự LRU
- Số đo thời gian ghi trong evidence/
5. Tiêu chí hoàn thành chung
- Tự giải thích được bài toán và vì sao chọn giải pháp.
- Code chạy được bằng lệnh ghi trong README, không chứa secret.
- Có test tự động cho happy path và failure path.
- Có log hoặc số đo trong
evidence/chứng minh kết quả. - Có câu trả lời phỏng vấn ngắn bằng tiếng Việt và tiếng Anh.
- README của lab có link ngược về bài học tương ứng.
6. Lab và trạng thái
| Mức | Bài tập | Trạng thái | Test / bằng chứng |
|---|---|---|---|
| Basic | equals/hashCode và HashMap | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Intermediate | Refactor theo SOLID | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Challenge | Generic cache có giới hạn | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
Repo lab: java-backend-interview-labs/labs/java-core. TODO: link GitHub là placeholder cho tới khi repo được push.
evidence/; chỉ đánh dấu xong khi có bằng chứng.Phỏng vấn hỏi về Java Core, câu nào hay gặp nhất và trả lời sao?
Q1. Vì sao override equals thì phải override hashCode?
🇻🇳 Tiếng Việt:
HashMap tìm bucket bằng hashCode trước rồi mới so equals. Hai object bằng nhau mà hashCode khác thì rơi vào hai bucket khác nhau, get() không tìm thấy dù equals trả true.
🇬🇧 English:
HashMap first finds the bucket with hashCode and only then compares with equals. If two equal objects have different hash codes they land in different buckets, so get() cannot find the value even though equals returns true.
Cách nhớ ngắn gọn
- Mỗi bài tập = code + test + log.
- Luôn có ít nhất một failure case.
- Chưa có bằng chứng thì chưa xong.
Tự kiểm tra
Bài tập Basic (equals/hashCode và HashMap) được coi là xong khi nào?
Có test fail với bản sai và pass với bản đúng; README giải thích bucket và vì sao hashCode phải nhất quán với equals. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Intermediate (Refactor theo SOLID) được coi là xong khi nào?
Test hành vi trước/sau refactor giống nhau; Thêm 1 strategy mới chỉ bằng 1 class mới. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Challenge (Generic cache có giới hạn) được coi là xong khi nào?
Test eviction đúng thứ tự LRU; Số đo thời gian ghi trong evidence/. Chưa có code chạy và bằng chứng thì chưa tính là xong.