Câu hỏi phỏng vấn lập trình viên Java: người phỏng vấn đào sâu điều gì?

Ứng viên Java ôn kỹ định nghĩa OOP hay Collections nhưng vẫn lúng túng khi bị hỏi tiếp “vì sao”. Bài viết gom các câu hỏi phỏng vấn lập trình viên Java theo nhóm kiến thức: Core Java, đa luồng, JVM, Spring Boot, JPA/Hibernate và SQL. Mỗi câu nêu rõ nhà tuyển dụng muốn kiểm tra gì cùng ý chính nên trả lời, phân theo cấp fresher, junior và middle.

câu hỏi phỏng vấn lập trình viên Java

Tổng quan nhanh

– Người phỏng vấn thường hỏi tiếp “vì sao” sau mỗi định nghĩa.

– Core Java và Collections được hỏi ở cả ba cấp độ.

– Spring Boot, JPA và SQL xuất hiện nhiều từ cấp junior.

– Một lỗi production kể rõ ràng phân biệt junior với middle.

Các phần dưới đi lần lượt qua bốn điểm này.

1. Vì sao người phỏng vấn Java hỏi “vì sao” nhiều hơn “là gì”?

Định nghĩa encapsulation học thuộc được trong một buổi tối. Câu hỏi thật đến ngay sau: vì sao HashMap không an toàn khi nhiều luồng cùng ghi, vì sao Spring dùng tiêm phụ thuộc (Dependency Injection) thay vì new. Hãy trả lời theo ba lớp: khái niệm, lý do thiết kế và tình huống đã gặp.

Câu trả lời “là gì” giúp bạn không bị loại, còn câu trả lời “vì sao” mới giúp bạn được chọn.

Mô tả công việc của nghề có trong bài Lập trình viên Java là gì? Mô tả công việc, kỹ năng và lộ trình phát triển.

2. Câu hỏi Core Java: OOP, Collections, Generics và Java hiện đại

Đây là nền móng của mọi buổi phỏng vấn Lập trình viên Java (Java Developer), sắp theo cấp độ ở bảng dưới.

Câu hỏi Cấp Nhà tuyển dụng kiểm tra Ý chính cần trả lời
Abstract class khác interface thế nào? Fresher Chọn đúng công cụ trừu tượng Class kế thừa một lớp nhưng triển khai nhiều interface; abstract class chia sẻ được trạng thái.
Vì sao String là immutable? Junior Hiểu bộ nhớ và an toàn dữ liệu Dùng chung qua String pool, an toàn giữa các luồng, hashCode không đổi nên làm khóa Map an toàn.
Vì sao override equals thì phải override hashCode? Junior Hợp đồng của HashMap, HashSet Hai đối tượng bằng nhau phải cùng hashCode, nếu không HashMap không tìm thấy phần tử.
Vì sao HashMap không thread-safe? Junior–Middle Rủi ro chạy đồng thời Nhiều luồng cùng ghi có thể mất dữ liệu; dùng ConcurrentHashMap khi cần ghi đồng thời.
Checked và unchecked exception khác nhau ra sao? Junior Tư duy xử lý lỗi Checked buộc xử lý lúc biên dịch, unchecked kế thừa RuntimeException; nêu try-with-resources.

Với câu HashMap, cần nêu cả hệ quả và giải pháp. Để xem doanh nghiệp yêu cầu kỹ năng Java nào, bạn có thể tham khảo việc làm CNTT – phần mềm và đối chiếu với phần đang ôn.

Java Generics

Java Generics cho phép tham số hóa kiểu để kiểm tra lúc biên dịch, nên phỏng vấn hay hỏi type erasure: kiểu tham số bị xóa khi biên dịch, nên lúc chạy danh sách String và danh sách Integer là cùng một class. Câu nối tiếp là wildcard theo nguyên tắc PECS: `? extends T` khi chỉ đọc ra, `? super T` khi ghi vào.

Stream API và lambda

Stream API xử lý tập hợp theo kiểu khai báo, còn lambda là cách viết gọn một functional interface như Predicate hay Function. Thao tác trung gian như filter, map chạy lười (lazy), chỉ thực thi khi gặp thao tác kết thúc như collect; stream đã kết thúc thì không dùng lại được.

Record và sealed class

Record là class mang dữ liệu bất biến, chính thức từ Java 16 (JEP 395), được trình biên dịch tự sinh constructor, accessor, equals, hashCode và toString. Sealed class, chính thức từ Java 17 (JEP 409), giới hạn class được kế thừa qua từ khóa permits.

3. Đa luồng, JVM và Garbage Collection ở mức khái quát

Câu hỏi về JVM và garbage collection thường bắt đầu bằng phân biệt heap chứa đối tượng dùng chung với stack chứa biến cục bộ của từng luồng. Garbage Collection thu hồi đối tượng không còn tham chiếu, nên câu “vì sao vẫn gặp OutOfMemoryError” kiểm tra hiểu biết về rò rỉ do giữ tham chiếu thừa, như cache tĩnh không xóa. Deadlock xảy ra khi hai luồng chờ khóa của nhau.

Java Memory Model, volatile và synchronized

Java Memory Model (JMM) là bộ quy tắc ở chương 17 của Java Language Specification, quy định khi nào giá trị một luồng ghi được luồng khác nhìn thấy, dựa trên quan hệ happens-before. Volatile chỉ giúp thay đổi được nhìn thấy ngay nhưng không làm count++ thành nguyên tử, hợp với cờ dừng luồng. Synchronized thêm quyền độc quyền cho một luồng, dùng khi cập nhật nhiều bước như cộng dồn số dư.

Lưu ý khi trả lời phần đa luồng và JVM

– Bạn không nên nêu tên bộ thu gom khi chưa kiểm tra.

– Bạn nên nói rõ phần nào đã làm thật, phần nào mới đọc.

Cách này giúp tránh bị hỏi vặn ở chi tiết chưa chắc.

4. Spring Boot, JPA/Hibernate và SQL

Nhiều vị trí Java hiện nay làm back-end với Spring Boot. Câu kinh điển là “vì sao dùng DI”: class không tự tạo phụ thuộc mà được Spring tiêm vào, nên dễ thay bằng bản giả khi viết unit test. Câu nối tiếp là vì sao tiêm qua constructor thay vì @Autowired trên field: phụ thuộc rõ ràng và khai báo được final.

Spring Boot auto-configuration tự tạo bean theo điều kiện như @ConditionalOnClass và lùi lại nhờ @ConditionalOnMissingBean khi bạn đã tự khai báo bean. Starter là gói phụ thuộc gom sẵn, ví dụ spring-boot-starter-web kéo theo Spring MVC và Tomcat nhúng. Actuator cung cấp endpoint giám sát như /actuator/health.

Với JPA/Hibernate và SQL, các câu hỏi xoay quanh hiệu năng truy vấn:

– Lỗi N+1 query xảy ra khi tải danh sách rồi truy vấn từng quan hệ con riêng lẻ.

– Lazy loading tiết kiệm truy vấn nhưng dễ gây lỗi khi truy cập ngoài transaction.

– @Transactional mặc định chỉ rollback với RuntimeException hoặc Error, checked exception cần cấu hình rollbackFor.

– Index giúp đọc nhanh hơn nhưng làm thao tác ghi chậm hơn và tốn dung lượng.

Bạn nên tự viết được truy vấn có JOIN và GROUP BY, vì nhiều nơi kiểm tra SQL thuần chứ không chỉ qua ORM.

5. Bài thiết kế API nhỏ và vòng live coding

Live coding Java thường là bài vừa phải như đếm tần suất phần tử bằng Map. Người phỏng vấn quan sát cách chọn cấu trúc dữ liệu và xử lý đầu vào rỗng. Với câu thiết kế REST API đơn hàng, hãy nói về endpoint, phương thức HTTP, mã trạng thái và phân trang.

câu hỏi phỏng vấn lập trình viên Java

6. Kể một lỗi production: ranh giới giữa junior và middle

Câu “hãy kể một lỗi production bạn từng xử lý” xuất hiện thường xuyên từ cấp junior. Junior hay kể chung chung, còn middle nêu được triệu chứng, cách điều tra qua log hay thread dump và nguyên nhân gốc. Ví dụ phù hợp là API chậm dần do N+1 query. Fresher có thể kể lỗi trong đồ án.

Lời khuyên

– Bạn hãy viết sẵn câu chuyện lỗi: triệu chứng, điều tra, nguyên nhân, khắc phục.

– Bạn nên nêu thời gian phản hồi trước và sau khi sửa.

– Bạn hãy chuẩn bị ý mình sẽ làm khác nếu gặp lại.

Sự cố từng gặp nhờ đó thành bằng chứng năng lực.

7. Câu hỏi thường gặp

1. Fresher Java có cần biết Spring Boot trước khi phỏng vấn? Nên biết ở mức tạo REST API đơn giản, nhưng Core Java vẫn được hỏi kỹ hơn.

2. Có nên ôn thuật toán khó khi ứng tuyển Java back-end? Tùy doanh nghiệp; phần lớn ở mức vừa phải, nên ưu tiên Collections.

3. Nên mang theo gì để minh họa kinh nghiệm? Một dự án GitHub bạn hiểu rõ và một câu chuyện lỗi đã xử lý.

Phỏng vấn Java là dịp chứng minh bạn hiểu cơ chế chứ không chỉ nhớ định nghĩa. Khi luyện câu hỏi phỏng vấn lập trình viên Java, hãy trả lời theo ba lớp khái niệm, lý do và trải nghiệm thực tế, ôn kỹ Core Java, Spring Boot, JPA cùng SQL, và chuẩn bị một lỗi production có số liệu. Hãy chọn một câu trong bảng và thử giải thích thành tiếng hôm nay.

Bài viết mang tính tham khảo; câu hỏi thực tế tùy doanh nghiệp, chi tiết kỹ thuật nên đối chiếu tài liệu chính thức của Java và Spring.

Minh An

Về Tác Giả

CareerLink

Sao chép thành công