Bài viết được sự cho phép của tác giả Kiên Nguyễn
Hôm nay ngồi viết bài, đang trong thời kì nhà nhà nhảy việc, người người nhảy việc. Chính vì lý do đó, thiết nghĩ nên viết một bài lựa ra một số câu hỏi phỏng vấn java hay giúp đỡ anh em.
Thật tình mà nói, 5 câu hỏi này không phải lúc nào bắt đầu phỏng vấn cũng hỏi. Thường thì người ta chạy roda vài câu đơn giản trước. Chả ai hỏi từ khóa ít dùng như thế này. Ví dụ như: Abstract là gì?. Interface là gì?. Sự khác biệt giữa Linked List và Array List?.
Thiệt tình là thế, nhưng nếu mấy ông đi phỏng vấn gặp ngay một ông anh khá cứng. Câu hỏi đâu tiên tất nhiên sẽ không phải như thế. Nên hãy tham khảo 5 câu hỏi dưới đây nhé:
Ở phía dưới câu hỏi là phần trả lời của mình, nếu có chỗ nào chưa chính xác các bạn vui lòng comment ở phía dưới.
Tuyển Java lương cao làm việc online
1. Từ khóa volatile là gì?. Tại sao ta cần sử dụng chúng?
Ghê, câu hỏi phỏng vấn Java đầu tiên mà đụng tới Volatile thì thường vị trí apply cũng là Senior rồi đấy!. Quay lại câu hỏi, cần nhớ rằng trong Java, mỗi thread (luồng) sẽ có một ngăn xếp (stack) được cấp phát riêng. Ngăn xếp có gì?
Ngăn xếp (stack) này chứa bản sao các biến (copy of variables) có thể truy cập.
Khi luồng được khởi tạo, nó sao chép tất cả các biến được phép truy cập vào luồng của nó. Lúc này cần tới từ khóa Volatile.
Volatile nói “Hey, JVM. Warning, this variable may be modified in another Thread”
Này JVM, hãy cẩn thận, biến này có thể được thay đổi ở một luồng khác đấy!
Chốt lại, từ khóa volatile đảm bảo rằng khi đọc và ghi vào một biến, giá trị của biến sẽ luôn được cập nhật và là global.
This implies that every thread accessing a volatile field will read the variable’s current value instead of (potentially) using a cached value.
Điều này ngụ ý rằng tất cả các luồng truy cập tới volatile field đều sẽ đọc được giá trị hiện tại của biến (thay vì các gía trị có thể được lưu trong bộ nhớ cache)
Nếu interviewer yêu cầu cho ví dụ:
public class KieBlog extends Thread { private volatile boolean close = false; public void run() { while(!close) { // do work } } public void close() { close = true; // interrupt here if needed } }
Ví dụ này phổ biến nhất, Thread KieBlog sẽ kết thúc khi cờ close bật là true, việc sử dụng Volatile sẽ đảm bảo giá trị biến close luôn được đọc từ luồng chính (main thread), không cần phải sử dụng từ khóa synchronized.
Nếu trong job description có nhắc tới thread, multi thread thì các bạn xem thêm các câu hỏi phỏng vấn java ở cuối bài nhé.
2. sleep() và wait() khác nhau như thế nào?
Sleep() là một hoạt động giữ monitor, khóa đối tượng được chia sẻ (lock of the shared object) trong số milisecond được chỉ định.
Sleep() thì chỉ cần trả lời ngắn gọn như vậy là được. Nhưng tới wait() thì các bạn lưu ý dùm là:
Wait(), pauses the thread until either the specified number of milliseconds have elapsed or it receives a desired notification from another thread (whichever is first)
Wait() thì chỉ cần tạm dừng một luồng trong số miliseconds được chỉ định HOẶC nhận được một thông báo từ luồng khác (tùy theo cái nào đến trước)
Sleep() thường được sử dụng phổ biến để kiểm tra một số kết quả nhất định. Chờ một kết quả khác đang trong quá trình thực thi.
Wait() thì lại thường được sử dụng trong các application đa luồng. Dùng kèm với notify() và notifyAll(). Nhằm đảm bảo tính đồng bộ hóa (synchronization) trên tất cả các thread.
3. Có hai thread đang chạy là 1 và 2. Thread 1 throw exception, thread 2 bắt như thế nào?
Để trả lời được câu này thì trước tiên phải nắm chắc về throw exception. Exception thường không phải là câu hỏi phỏng vấn java hay gặp. Tuy nhiên, nắm chắc thì càng tốt, có thể đọc bài viết về Java Exception ở KieBlog. Đây cũng được đánh giá là một câu hỏi phỏng vấn lạ cho những ai ít lập trình đa luồng (multi thread).
Để catch được exception ở thread khác, ta có thể sử dụng Thread.UncaughtExceptionHandler. Xem xét ví dụ dưới đây:
// Khởi tạo handle Thread.UncaughtExceptionHandler handler = new Thread.UncaughtExceptionHandler() { public void uncaughtException(Thread th, Throwable ex) { System.out.println("Uncaught exception: " + ex); } }; // Tạo thread thứ 2, tất nhiên là new Thread Thread threadTwo = new Thread() { public void run() { System.out.println("Tạm dừng thread"); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Dừng."); } System.out.println("Throwing exception ..."); throw new RuntimeException(); } }; // Set uncaught exception, cần có argument handler // ném ra an uncaught exception threadTwo.setUncaughtExceptionHandler(handler); // Tới đây, exception được ném ra ở threadTwo sẽ được bắt lại thông qua handler threadTwo.start();
4. Method reference là gì?. Tiện lợi như nào?
Kể từ sau Java 8, đây cũng là một câu hỏi phỏng vấn java khá hay. Rất có thể anh em đã dùng nhiều, nhưng để trả lời cho chuẩn chỉnh thì chưa chắc đã trả lời được.
Method reference được giới thiệu ở Java 8 cho phép ta khởi tạo cái constructors và các methods (static hoặc không). Quan trọng là các methods hay constructors này có thể sử dụng như là lambdas.
// Interview service // Sai một câu thì trướt =))) final InterviewService service = new InterviewService(); service.start(); onFailAnswer(new Runnable() { @Override public void run() { service.stop(); } });
Với lambdas, chả cần phải viết dài dòng văn tự như vậy
// Easy for lambdas onFailAnswer(() -> service.stop());
Nhắc tới reference method chắc chắn phải nhắc tới Stream, qủy Stream sử dụng rất linh hoạt như này:
// Lấy ra toàn bộ title các câu hỏi phỏng vấn // Reference ở chỗ method gọi sau :: List<InterviewQuestion> itvQuestion = ... List<String> questionTitle = itvQuestion.stream() .map(InterviewQuestion::getQuestionTitle) .map(String::toLowerCase) .collect(toList());
5. Sự khác biệt giữa Jar và war
Ẹc, câu này cũng độc, chưa chắc là ai cũng trả lời đúng nhé.
JAR gần giống như nghĩa của nó, cái hũ:
- Full form của các file Java.
- Một file JAR có thể có nhiều file Java.
- JAR thường được sử dụng để lưu giữ library.
Còn WAR thì sao, WAR lại không gần giống như nghĩa chiến tranh:
- Full form của WAR là Web Archive Files.
- WAR chứa đủ thứ: XML, Java Servlet page, …
- Chủ yếu sử dụng cho ứng dụng web.
Câu này giống như hỏi troll ấy nhở?
6. Tham khảo thêm các câu hỏi phỏng vấn java
Phù, cuối cùng cũng hêt 5 câu hỏi mình muốn chia sẻ. Các bạn trả lời được mấy câu?.
Chưa đúng thì tìm hiểu thêm nha, chúc may mắn!
Kể từ sau khi Stream được giới thiệu trong Java 8, Stream chắc chắn sẽ có trong danh sách các câu hỏi phỏng vấn java. Để nắm chắc, tự tin khi phỏng vấn Stream, các ông có thể đọc bài Tuốt tuồn tuột về Stream trong Java 8 ở Kieblog. Đọc xong thì trả lời tuốt tuồn tuột luôn.
Tất nhiên học không phải là chỉ để phỏng vấn, nhớ cho mình nữa ha!
Ngoài ra, để chuẩn bị thật tốt, hãy tham khảo thêm một số nguồn sau:
Bài viết gốc được đăng tải tại kieblog.vn
Có thể bạn quan tâm:
- Top 5 câu hỏi phỏng vấn Vuejs hay và khó
- Top 5 câu hỏi phỏng vấn Python không thể bỏ qua
- Vượt qua các bài phỏng vấn Javascript
Xem thêm Việc làm cntt hấp dẫn trên TopDev