Phỏng vấn Java thường bao gồm 3 phần chính: kiến thức ngôn ngữ Java core, OOP và design pattern, và kinh nghiệm với framework/công nghệ. Dưới đây là tổng hợp các câu hỏi thường gặp nhất kèm hướng dẫn trả lời.
Nhóm 1: Java Core Fundamentals
1. Sự khác biệt giữa == và .equals() trong Java?
Trả lời: == so sánh tham chiếu (địa chỉ bộ nhớ), còn .equals() so sánh giá trị nội dung. Với các đối tượng như String, luôn dùng .equals() để so sánh nội dung. Ví dụ: new String("abc") == new String("abc") trả về false, nhưng .equals() trả về true.
2. String, StringBuilder và StringBuffer khác nhau như thế nào?
- String: Immutable – mỗi lần thay đổi tạo ra object mới
- StringBuilder: Mutable, không thread-safe, hiệu năng cao hơn trong single thread
- StringBuffer: Mutable, thread-safe (synchronized), dùng trong môi trường đa luồng
3. Final, Finally và Finalize khác nhau thế nào?
- final: Từ khóa khai báo hằng số, class không thể kế thừa, method không thể ghi đè
- finally: Block trong try-catch luôn được thực thi dù có exception hay không
- finalize(): Method của Object, được JVM gọi trước khi garbage collect (đã deprecated từ Java 9)
4. Checked Exception vs Unchecked Exception?
Checked Exception (ví dụ: IOException, SQLException) buộc phải được xử lý tại compile time bằng try-catch hoặc khai báo throws. Unchecked Exception (ví dụ: NullPointerException, ArrayIndexOutOfBoundsException) là subclass của RuntimeException, không bắt buộc phải xử lý.
Nhóm 2: OOP và Collections
5. Overloading vs Overriding?
| Tiêu chí | Overloading | Overriding |
|---|---|---|
| Xảy ra khi | Cùng class | Class cha và class con |
| Quyết định lúc | Compile time | Runtime |
| Return type | Có thể khác | Phải giống hoặc covariant |
| Static method | Có thể | Không thể (method hiding) |
6. ArrayList vs LinkedList – Khi nào dùng cái nào?
- ArrayList: Truy cập random nhanh O(1), chèn/xóa chậm O(n) – dùng khi đọc nhiều
- LinkedList: Truy cập tuần tự chậm O(n), chèn/xóa đầu/cuối nhanh O(1) – dùng khi thêm/xóa nhiều
7. HashMap hoạt động như thế nào nội bộ?
HashMap sử dụng mảng Node[] (bucket). Khi put một cặp key-value, Java tính hashCode() của key, sau đó dùng phép toán để xác định vị trí bucket. Nếu có collision (hash trùng), Java dùng linked list (Java 7) hoặc balanced tree (Java 8+, khi bucket > 8 phần tử) để lưu trữ.
Nhóm 3: Java Advanced
8. Giải thích Java Memory Model (JMM)
JVM chia bộ nhớ thành: Heap (lưu object, chia sẻ giữa các thread), Stack (lưu biến cục bộ, riêng mỗi thread), Method Area/Metaspace (lưu class metadata), và Program Counter Register.
9. Stream API trong Java 8 là gì?
Stream API cho phép xử lý tập hợp dữ liệu theo kiểu functional programming với các operation như filter(), map(), reduce(), collect(). Stream không lưu trữ dữ liệu, hỗ trợ lazy evaluation và có thể chạy song song với parallelStream().
10. Sự khác biệt giữa interface và abstract class trong Java 8+?
Từ Java 8, interface có thể có default và static method. Tuy nhiên, abstract class vẫn có thể có constructor, biến instance, và trạng thái. Nên dùng interface khi muốn định nghĩa contract (khả năng), dùng abstract class khi muốn chia sẻ implementation chung.
Lời Khuyên Để Vượt Qua Technical Interview
- Hiểu sâu nguyên lý thay vì học thuộc lòng câu trả lời
- Thực hành code trên giấy hoặc whiteboard
- Chuẩn bị câu hỏi ngược lại cho interviewer
- Giải thích tư duy trước khi code, không im lặng
- Ôn lại các bài LeetCode mức Easy-Medium về Array, String, HashMap
Kết Luận
Phỏng vấn Java không chỉ kiểm tra kiến thức mà còn đánh giá cách bạn suy nghĩ và giải quyết vấn đề. Hãy chuẩn bị kỹ, tự tin trình bày, và đừng quên thực hành code thực tế mỗi ngày.
]]>