Top 50 câu hỏi và trả lời phỏng vấn Java ( Phần 5)

Đăng bởi: Admin | Lượt xem: 1764 | Chuyên mục: Java

Hướng dẫn này bao gồm các chủ đề JAVA như định nghĩa Java cơ bản, khái niệm OOP,Access specifiers, Collections, Exceptions, Threads, Serialization,...với các ví dụ để bạn sẵn sàng đối mặt với bất kỳ cuộc phỏng vấn JAVA nào một cách tự tin.


Trong hướng dẫn này, chúng tôi đã trình bày gần 50+ câu hỏi phỏng vấn Java cốt lõi quan trọng cho những người mới và ứng viên có kinh nghiệm.

Bài đăng này trên Câu hỏi phỏng vấn JAVA được chuẩn bị để giúp bạn hiểu các khái niệm cơ bản về lập trình Java cho mục đích phỏng vấn. Tất cả các khái niệm JAVA quan trọng được giải thích ở đây với các ví dụ để bạn dễ hiểu.

Câu hỏi phỏng vấn Java phổ biến nhất

Dưới đây là danh sách đầy đủ các câu hỏi phỏng vấn lập trình Java cơ bản và nâng cao quan trọng nhất và thường được hỏi với các câu trả lời chi tiết.

Q # 40) Giải thích về phương thức Join () sử dụng trong điều khiển Thread.

Trả lời: Phương thức Join () được sử dụng để nối một luồng với phần cuối của luồng hiện đang chạy.

Thí dụ:

public static void main (String[] args){

    Thread t = new Thread ();

    t.start ();

    t.join ();

}

Từ đoạn mã trên, luồng chính đã bắt đầu thực thi. Khi nó chạy mã t.start () thì 'thread t' bắt đầu ngăn xếp riêng để thực thi. JVM chuyển đổi giữa luồng chính và 'thread t'.

Khi nó đạt đến mã t.join () thì một mình 'thread t' được thực thi và hoàn thành nhiệm vụ của nó, sau đó chỉ có luồng chính bắt đầu thực thi.

Đây là một phương pháp non-static. 

Q # 41) Phương thức yield () của lớp Thread làm gì?

Trả lời: Phương thức yield() di chuyển luồng hiện đang chạy sang trạng thái runnable  và cho phép các luồng khác thực thi. . Đây là một static method

Phương thức Yield () chỉ di chuyển luồng về trạng thái Runnable chứ không chuyển luồng xử lý sang trạng thái sleep (), wait () (hoặc) block.

Thí dụ:

public static void main (String[] args){

    Thread t = new Thread ();

    t.start ();
}

    public void run(){

        Thread.yield();

    }

}

Q # 42) Giải thích về phương thức Wait ().

Trả lời: phương thức Wait () được sử dụng để tạo luồng chờ trong nhóm chờ. Khi phương thức Wait () được thực thi trong khi thực hiện luồng thì ngay lập tức luồng sẽ chuyển sang trạng thái wating. Phương thức Wait () cho biết luồng chờ trong một khoảng thời gian nhất định.

Sau đó, luồng sẽ chuyển sang trạng thái ready khi có một thread khác gọi tới phương thức notify() (hoặc) notifyall ()

Wait () chủ yếu được sử dụng trong đồng bộ hóa.

Thí dụ:

public static void main (String[] args){

    Thread t = new Thread ();

    t.start ();

    Synchronized (t) {

        Wait();

    }

}

Q # 43) Sự khác biệt giữa phương thức notify() và phương thức notifyAll() trong Java.

Trả lời: Sự khác biệt giữa phương thức notify () và phương thức notifyAll () được liệt kê dưới đây:

thông báo ()

thông báo cho tất cả ()

Phương pháp này được sử dụng để gửi tín hiệu để đánh thức một luồng trong nhóm chờ.

Phương thức này gửi tín hiệu để đánh thức tất cả các luồng trong một nhóm chờ.

Q # 44) Làm thế nào để dừng một Thread trong java? Giải thích về phương thức sleep() trong một Thread?

Trả lời: Chúng ta có thể dừng một luồng bằng cách sử dụng các trạng thái của một luồng: 

  • Sleeping
  • Waiting
  • Blocked

Ngủ:  Phương thức Sleep () được sử dụng để sleep luồng hiện đang thực thi trong khoảng thời gian nhất định. Khi luồng được đánh thức, nó có thể chuyển sang trạng thái runnable. Vì vậy, phương thức sleep() được sử dụng để trì hoãn việc thực thi trong một khoảng thời gian.

Đây là một static method.

Thí dụ:

Thread. Sleep (2000)

nó trì hoãn thread để sleep 2 mili giây. Phương thức Sleep () đưa ra một  uninterrupted exception do đó chúng ta cần đặt trong try /catch

public class ExampleThread implements Runnable{

    public static void main (String[] args){

        Thread t = new Thread ();

        t.start ();

    }

    public void run(){

        try{

            Thread.sleep(2000);

        }catch(InterruptedException e){

    }

}

Q # 45) Khi nào nên sử dụng Thread class Vs Runnable inteface trong Java?

Trả lời: Nếu ta cần lớp mở rộng một số lớp khác ngoài thread thì ta có thể sử dụng Runnable interface được vì trong java chỉ có thể mở rộng một lớp.

             Nếu chúng ta sẽ không mở rộng bất kỳ lớp nào thì chúng ta có thể mở rộng lớp Thread.

Q # 46) Sự khác biệt giữa phương thức start () và run() của lớp Thread.

Trả lời: Phương thức Start() tạo ra một luồng mới và mã bên trong phương thức run() được thực thi trong luồng mới. Nếu chúng ta gọi trực tiếp phương thức run () thì một luồng mới không được tạo và luồng hiện đang thực thi sẽ tiếp tục thực thi phương thức run ().

Q # 47) Đa luồng là gì?

Trả lời: Nhiều luồng được thực hiện đồng thời. Mỗi luồng bắt đầu ngăn xếp riêng dựa trên mức độ ưu tiên của luồng.

Chương trình ví dụ:

public class MultipleThreads implements Runnable

{

    public static void main (String[] args){//Main thread starts here

        Runnable r = new runnable ();

        Thread t=new thread ();

        t.start ();//User thread starts here

        Addition add=new addition ();
 
    }

    public void run(){

        go();

    }//User thread ends here

}

JVM gọi phương thức main() và ngăn xếp, main thread trông như dưới đây.

Chủ đề1

Khi thực thi đến dòng t.start ()  một luồng mới được tạo và ngăn xếp mới cho thread cũng được tạo. Bây giờ JVM chuyển sang thread  mới và main thread trở lại trạng thái Runnable

Hai ngăn xếp trông như dưới đây.

Chủ đề2

Bây giờ, user thread đã thực thi mã bên trong phương thức run ().

Chủ đề3

Khi phương thức run () đã hoàn thành, thì JVM sẽ quay trở lại main thread và user thread đã hoàn thành nhiệm vụ và ngăn xếp đã biến mất.

JVM chuyển đổi giữa mỗi thread cho đến khi cả hai thread được hoàn thành. Điều này được gọi là đa luồng.

Q # 48) Giải thích vòng đời của Thread trong Java.

Trả lời: Thread có các trạng thái sau:

  • New
  • Runnable
  • Running
  • Non-runnable (Blocked)
  • Terminated

Vòng đời chủ đề trong JAVA

  • New : Ở trạng thái New, một phiên bản Thread đã được tạo nhưng phương thức start () chưa được gọi. Trong trạng thái này, các thread chưa được coi là còn sống
  • Runnable : Thread ở trạng thái runnable sau khi gọi phương thức start (), nhưng trước khi phương thức run () được gọi. Nhưng một thread cũng có thể trở lại trạng thái runnable từ sleep / wait. Trong trạng thái này, các thread được coi là còn sống.
  • Running : Thread ở trạng thái running sau khi nó gọi phương thức run (). Bây giờ các thread bắt đầu thực thi.
  • Non-Runnable (Bị chặn): Thread còn sống nhưng nó không đủ điều kiện để chạy. Nó không ở trạng thái runnable nhưng nó sẽ trở lại trạng thái runnable sau một thời gian. Ví dụ: wait, sleep, block
  • Terminated : Một khi phương thức run được hoàn thành thì nó bị chấm dứt (trerninated). Bây giờ thread không còn sống.

Q # 49) Đồng bộ hóa (Synchronization) là gì?

Trả lời: Đồng bộ hóa chỉ tạo một luồng để truy cập một khối mã tại một thời điểm. Nếu nhiều luồng truy cập vào khối mã, thì có thể có kết quả không chính xác khi kết thúc chương trình. Để tránh sự cố này, ta phải đồng bộ hóa cho những khối mã cần đồng bộ

Synchronization có nghĩa là một luồng cần một khóa (key) để truy cập mã được đồng bộ hóa.

Mỗi đối tượng Java có một khóa. Một khóa chỉ có một chìa khóa. Một luồng chỉ có thể truy cập phương thức được đồng bộ hóa nếu luồng có thể lấy chìa khóa cho các đối tượng để mở khóa.

Thí dụ:

public class ExampleThread implements Runnable{
 
     public static void main (String[] args){

         Thread t = new Thread ();

         t.start ();

     }

     public void run(){

         synchronized(object){

         }

    }

}

Q # 50) Nhược điểm của đồng bộ hóa (Synchronization) là gì?

Trả lời: Nếu đồng bộ hóa có thể thực hiện tất cả các phương thức. Bởi vì nếu một luồng truy cập mã được đồng bộ hóa thì luồng tiếp theo sẽ phải chờ. Vì vậy, nó làm cho  hiệu suất chậm .

Q # 51) Tuần tự hóa (Serialization) là gì?

Trả lời: Chuyển đổi file thành byte stream được gọi là Serialization. Các đối tượng trong file được chuyển đổi thành byte cho mục đích bảo mật. Để sử dụng Serialization, chúng ta cần implement java.io.Serializable. Nó không có phương thức định nghĩa

Các biến transient( tạm thời) không phải là một phần của tuần tự hóa. Vì vậy, chúng ta có thể bỏ qua việc tuần tự hóa cho các biến trong file bằng cách sử dụng từ khóa transient cho các biến.

Q # 52) Mục đích của biến transient là gì?

Trả lời: Biến transient không phải là một phần của quá trình tuần tự hóa. Trong quá trình deserialization, các giá trị của các biến transient được đặt thành giá trị mặc định. Nó không được sử dụng với các biến static.

Thí dụ:

transient int numbers;

Q # 53) Những phương pháp nào được sử dụng trong quá trình Serialization và Deserialization?

Trả lời: Các lớp ObjectOutputStream và ObjectInputStream là cấp cao hơn của java.io. package. Ta sẽ sử dụng chúng với các lớp FileOutputStream và FileInputStream.

ObjectOutputStream.writeObject - > Serialize đối tượng và ghi đối tượng được Serialization vào một file.

ObjectInputStream.readObject ->  Đọc tệp và Deserialization đối tượng.

Để được tuần tự hóa, một đối tượng phải implement Serializable interface. Nếu lớp cha thực hiện tuần tự hóa, thì lớp con sẽ tự động được tuần tự hóa.

Q # 54) Mục đích của biến Volatile là gì?

Trả lời: Các giá trị biến Volatile luôn được đọc từ bộ nhớ chính chứ không phải từ bộ nhớ đệm của thread. Biến Volatile được sử dụng chủ yếu trong quá trình đồng bộ hóa. 

Thí dụ:

volatile int number;

Q # 55) Sự khác biệt giữa Serialization và Deserialization trong Java.

Trả lời: Đây là sự khác biệt giữa tuần tự hóa và giải tuần tự hóa trong java:

Serialization

Deserialization

Serialization là quá trình được sử dụng để chuyển đổi các đối tượng thành byte

Deserialization là quá trình giải tuần tự hóa chúng ta có thể lấy các đối tượng trở lại từ byte.

Một đối tượng được tuần tự hóa bằng cách viết cho nó một ObjectOutputStream.

Một đối tượng được giải tuần tự hóa bằng cách đọc nó từ ObjectInputStream.

Q # 56) SerialVersionUID là gì?

Trả lời: Bất cứ khi nào một đối tượng được tuần tự hóa, đối tượng được đóng dấu số version ID cho lớp đối tượng. ID này được gọi là serialVersionUID. Điều này được sử dụng trong quá trình Deserialization để xác minh rằng người gửi và người nhận tương thích với Serialization.

vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!



Khóa học liên quan

Khóa học: Java

Tổng hợp Bài tập Java có lời giải
Số bài học:
Lượt xem: 15629
Đăng bởi: Admin
Chuyên mục: Java

Lập trình Java cơ bản
Số bài học:
Lượt xem: 33456
Đăng bởi: Admin
Chuyên mục: Java