Bộ câu hỏi phỏng vấn Java phần 7

Sự khác biệt giữa fail-fast và fail-safe là gì?


  • Thuộc tính fail-safe của Iterator hoạt động với bản sao của collection và do đó, nó không bị ảnh hưởng bởi bất kỳ sửa đổi nào trong collection.
  • Tất cả các lớp collection trong gói java.util là fail-fast, trong khi các lớp collection trong java.util.concurrent là fail-safe.
  • Các Fail-fast iterators thảy ra một ConcurrentModificationException, trong khi Fail-safe iterators không bao giờ thảy một exception như vậy.

Sự khác nhau giữa Thread.start và Thread.run trong Java


Cả 2 phương thức này đều có chức năng gọi đến phương thức run() của thre`ad và thực thi các dòng code bên trong phương thức này. Vậy sự khác nhau giữa chúng là:

  • Khi chúng ta gọi phương thức start(), 1 thread mới sẽ được tạo và code trong phương thức run() sẽ được thực thi trong thread mới này. Nếu chúng ta gọi phương thức run(), không có thread mới nào được tạo và code trong run() sẽ được thực thi tại thread hiện tại.
  • Ngoài ra, chúng ta không thể gọi phương thức start() 2 lần trên đối tượng thread, việc này sẽ quăng ra lỗi IllegalStateException trong Java. Trong khi đó, chúng ta có thể gọi phương thức run() 2 lần trên đối tượng thread.

Có bất cứ thứ gì giống như static-class trong java không?


Java không có cách nào tạo ra một static-class hoàn chỉnh nhất nhưng bạn có thể mô phỏng một static-class như thế này:

  • Khai báo class của bạn là final - Ngăn việc mở rộng lớp vì việc mở rộng static-class không có ý nghĩa gì.
final class SimulationStaticClass {
}
  • Đặt phương thức constructor ở chế độ private - Ngăn chặn việc khởi tạo bằng mã máy khách vì việc khởi tạo một static-class không có ý nghĩa gì.
  • Đặt tất cả các thuộc tính và phương thức của class là static - Vì lớp không thể được khởi tạo nên không thể gọi các phương thức của instance hoặc không truy cập được các thuộc tính của instance.
  • Lưu ý rằng trình biên dịch sẽ không ngăn bạn khai báo một instance (non-static) - Sự cố sẽ chỉ xuất hiện nếu bạn cố gắng gọi thuộc tính của instance.

Comparable interface và Comparator interface là gì? Liệt kê sự khác biệt của chúng?


  • Comparable interface chỉ chứa một phương thức, được gọi là CompareTo. Phương thức này so sánh hai đối tượng, để áp đặt thứ tự giữa chúng. Cụ thể, nó trả về một số nguyên âm, 0 hoặc một số nguyên dương để chỉ ra rằng đối tượng thứ nhất nhỏ hơn, bằng hoặc lớn hơn đối tượng thứ hai.
  • Comparator interface chứa hai phương thức, được gọi là compare và equals. Phương thức đầu tiên so sánh hai đối số đầu vào của nó và áp đặt thứ tự giữa chúng. Nó trả về một số nguyên âm, 0 hoặc một số nguyên dương để chỉ ra rằng đối số đầu tiên nhỏ hơn, bằng hoặc lớn hơn đối số thứ hai. Phương thức thứ hai yêu cầu một đối tượng (A) làm tham số và nhằm quyết định xem đối tượng đầu vào có bằng với comparator (B) hay không. Phương thức trả về true, chỉ khi đối tượng (A) cũng là một comparator và nó áp đặt cùng một thứ tự như comparator (B).

Khi nào thì hàm finalize() được gọi?


Phương thức finalize được gọi bởi bộ thu gom rác, ngay trước khi giải phóng bộ nhớ của đối tượng. Thông thường nên giải phóng các tài nguyên do đối tượng nắm giữ bên trong phương thức finalize

Applet Security Manager là gì và nó cung cấp những gì?


  • Applet Security Manager (trình quản lý bảo mật applet) là một cơ chế để áp đặt các hạn chế đối với các Java applet. Một trình duyệt chỉ có thể có một trình quản lý bảo mật.
  • Applet Security Manager được thiết lập khi khởi động và sau đó nó không thể bị thay thế, quá tải, ghi đè hoặc mở rộng.

Scriptlets trong Java là gì?


  • Trong công nghệ Java Server Pages (JSP), scriptlet là một đoạn mã Java được nhúng trong một trang JSP.
  • Scriptlet là mọi thứ bên trong các tags. Giữa các tags này, người dùng có thể thêm bất kỳ scriplet hợp lệ.

Mối quan hệ giữa một event-listener interface và một event-adapter class là gì?


  • Một event-listener interface định nghĩa các phương thức phải được thực thi bởi một event handler cho một event cụ thể.
  • Một event adapter cung cấp một triển khai mặc định cho một event-listener interface.

Trình bày các cách khác nhau để tạo một Thread. Bạn thích cách nào và tại sao?


Có ba cách có thể được sử dụng để tạo một Thread:

  • Một class có thể mở rộng (extend) Thread class.
  • Một class có thể triển khai Runnable interface.
  • Một ứng dụng có thể sử dụng Executor framework, để tạo một thread pool.

Runnable interface được ưu tiên hơn, vì nó không yêu cầu một đối tượng kế thừa Thread class. Trong trường hợp thiết kế ứng dụng của bạn yêu cầu đa kế thừa, chỉ có các interface mới có thể giúp bạn. Ngoài ra, thread pool rất hiệu quả và có thể được thực hiện và sử dụng rất dễ dàng.

Những hạn chế của các Java applets là gì?


Chủ yếu là vì lý do bảo mật, các Java applets có các hạn chế như sau:

  • Một applet không thể tải các thư viện hoặc xác định các native method.
  • Thông thường một applet không thể đọc hoặc ghi các files trên máy chủ thực thi.
  • Một applet không thể đọc một số thuộc tính hệ thống nhất định.
  • Một applet không thể tạo kết nối mạng ngoại trừ máy chủ của nó.
  • Một applet không thể khởi động bất kỳ chương trình nào trên máy chủ đang thực thi nó.

Java là "pass-by-reference" hay "pass-by-value"?


Java luôn là pass-by-value. Thật không may, khi chúng ta truyền giá trị của một đối tượng, chúng ta đang truyền tham chiếu đến nó. Không có cái gọi là "pass-by-reference" trong Java. Điều này gây nhầm lẫn cho người mới bắt đầu. Chìa khóa để hiểu điều này là một cái gì đó như:

Dog myDog;

không phải là một Dog; nó thực sự là một con trỏ đến một Dog. Vì vậy, khi bạn có

Dog myDog = new Dog("Rover");
foo(myDog);

về cơ bản bạn đang truyền địa chỉ của đối tượng Dog đã tạo cho phương thức foo

So sánh phương thức sleep() và wait() trong Java?


  • sleep() được sử dụng để tạm ngưng quá trình của thread hiện tại với một khoảng thời gian được chỉ định. Lưu ý khoảng thời gian tạm ngưng không thể là số âm nếu không sẽ bị thảy ra IllegalArgumentException.
  • Mặt khác, wait(), chỉ cần tạm dừng thread cho đến khi (a) số mili giây đã chỉ định trôi qua hoặc (b) nó nhận được thông báo mong muốn từ một thread khác (tùy điều kiện nào đến trước).
  • sleep() được sử dụng phổ biến nhất để thăm dò ý kiến, hoặc để kiểm tra các kết quả nhất định, ở một khoảng thời gian đều đặn. wait() thường được sử dụng trong các ứng dụng đa luồng, kết hợp với notify() hoặc notifyAll(), để đạt được đồng bộ hóa và tránh các race conditions (race condition là một tình huống xảy ra khi nhiều threads cùng truy cập và cùng lúc muốn thay đổi dữ liệu).

Tại sao Java có các trường transient?


  • Từ khóa transient trong Java được sử dụng để chỉ ra rằng một trường (field) sẽ không là một phần của tuần tự hóa (serialization).
  • transient đóng vai trò quan trọng trong bảo mật, bạn có thể sử dụng nó để chắc rằng không lưu các nội dung nhạy cảm xuống file, database hoặc chuyển chúng đến một nơi khác.

Bạn có thể truy cập biến non-static trong static context không?


  • Một biến static trong Java thuộc về class của nó và giá trị của nó không đổi cho tất cả các instance của nó.
  • Một biến static được khởi tạo khi lớp được tải bởi JVM. Nếu mã của bạn cố gắng truy cập vào một biến non-static, không có bất kỳ instance nào, trình biên dịch sẽ báo lỗi, bởi vì các biến đó chưa được tạo và chúng không được liên kết với bất kỳ instance nào

Có sự khác biệt nào giữa Protocol trong Swift và Interface trong Java không?


Về cơ bản, các Swift protocol rất giống với Java interface ngoại trừ:

Swift protocol có thể chỉ định các thuộc tính phải được triển khai. Swift protocol cần xử lý giá trị / tham chiếu thông qua việc sử dụng từ khóa "mutating" (vì các protocol có thể được thực hiện bởi structure, enumeration hoặc class). Bạn có thể kết hợp các protocol tại bất kỳ thời điểm nào bằng cách sử dụng "Protocol Composition". Điều này thay thế cách protocol<A, B> cũ của protocol composition. Ví dụ: khai báo một tham số hàm phải tuân theo protocol Named và Aged:

func wishHappyBirthday(to celebrator: Named & Aged) {}

Tại sao Spring MVC lại tốt hơn Servlets/JSP?


  • Các Servlet dựa trên một API cấp thấp để xử lý các yêu cầu và phản hồi. Các web frameworks như Spring MVC được thiết kế để giúp việc xây dựng các ứng dụng web xử lý các yêu cầu và phản hồi HTTP trở nên dễ dàng hơn. Hầu hết các Java web frameworks, bao gồm cả Spring MVC, đều sử dụng các servlet bên trong.
  • Không nhất thiết phải 'tốt hơn' nhưng Spring MVC về cơ bản là một phần trừu tượng cấp cao hơn được xây dựng trên Java Servlet tập trung xung quanh mẫu thiết kế Model View Controller. Mô hình này thúc đẩy sự tách biệt các mối quan tâm khi xây dựng ứng dụng web của bạn.
  • Cốt lõi của framework này là lớp DispatcherServlet chính là một Servlet thực hiện mẫu thiết kế Front Controller.
Avatar Techmely Team
VIẾT BỞI

Techmely Team