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

Khi nào sử dụng LinkedList thay vì ArrayList trong Java?


LinkedList và ArrayList là hai cách triển khai khác nhau của List interface. LinkedList triển khai nó với một danh sách được liên kết kép.

  • LinkedList<E> cho phép chèn hoặc xóa liên tục bằng cách sử dụng trình vòng lặp, nhưng chỉ truy cập tuần tự các phần tử. Nói cách khác, bạn có thể tiến hoặc lùi danh sách, nhưng việc tìm một vị trí trong danh sách cần thời gian tỷ lệ thuận với kích thước của danh sách.
  • Mặt khác, ArrayList<E> cho phép truy cập đọc ngẫu nhiên nhanh chóng, vì vậy bạn có thể lấy bất kỳ phần tử nào trong thời gian không đổi. Nhưng việc thêm hoặc bớt từ bất kỳ đâu trừ phần cuối yêu cầu phải chuyển tất cả các phần tử sau lên, để tạo lỗ hổng hoặc lấp đầy khoảng trống.

RMI là gì?


Java Remote Method Invocation (Java RMI) là một Java API thực hiện hướng đối tượng tương đương với các lệnh gọi thủ tục từ xa (Remote Procedure Calls), với hỗ trợ transfer trực tiếp các lớp Java được tuần tự hóa và thu gom rác phân tán.

Remote Method Invocation (RMI) cũng có thể được coi là quá trình kích hoạt một phương thức trên một đối tượng đang chạy từ xa. RMI cung cấp sự minh bạch về vị trí vì người dùng cảm thấy rằng một phương thức được thực thi trên một đối tượng đang chạy cục bộ.

Làm cách nào để kiểm tra một private function hoặc một class có các phương thức, thuộc tính hoặc class bên trong có quyền truy cập là private?


Vấn đề: Làm cách nào để unit-test (sử dụng xUnit) một class có các phương thức, thuộc tính hoặc lớp lồng nhau có quyền truy cập là private?

Giải pháp:

Cách tốt nhất để kiểm tra các private methods là sử dụng reflection.

Các pattern sau sẽ cho phép bạn thực hiện hầu hết mọi thứ liên quan đến các phương thức và thuộc tính có quyền truy cập là private:

Method method = TargetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);

Và đối với các thuộc tính:

Field field = TargetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);

Servlet Chaining là gì?


Servlet Chaining là phương thức mà đầu ra của một servlet được gửi đến một servlet thứ hai. Đầu ra của servlet thứ hai có thể được gửi đến servlet thứ ba, v.v. Servlet cuối cùng trong chuỗi chịu trách nhiệm gửi phản hồi đến client.

image

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


Khi một applet được tải qua internet, applet sẽ được tải bởi applet classloader.

Classloader thực thi phân cấp Java namespace. Ngoài ra, classloader đảm bảo rằng một namespace duy nhất tồn tại cho các class đến từ Local file system và một namespace duy nhất tồn tại cho mỗi nguồn mạng.

Khi một trình duyệt tải một applet qua internet, các class của applet đó được đặt trong một namespace riêng được liên kết với gốc của applet. Sau đó, các class được tải bởi classloader sẽ được chuyển qua trình xác minh. Trình xác minh kiểm tra xem class file lớp có tuân thủ theo đặc tả ngôn ngữ Java hay không. Trong số những thứ khác, trình xác minh đảm bảo rằng không có stack overflows hoặc stack underflows và các tham số cho tất cả các lệnh bytecode đều chính xác.

Sự khác biệt giữa một phương thức đồng bộ hóa và một khối đồng bộ hóa?


Trong lập trình Java, mỗi đối tượng có một khóa. Một thread có thể nhận được khóa của một đối tượng bằng cách sử dụng từ khóa synchronized.

Từ khóa synchronized có thể được áp dụng ở cấp độ phương thức(coarse grained lock) hoặc cấp độ khối của mã (fine grained lock).

Không gian Perm Gen trong Heap là gì?


Perm Gen là viết tắt của Permanent Generation. Nó là không gian trên Java Heap chứa siêu dữ liệu mô tả các user class (các class không phải là một phần của ngôn ngữ Java).

Một ví dụ về siêu dữ liệu như đã nói trên là các đối tượng mô tả các lớp và phương thức và chúng được lưu trữ trong Permanent Generation.

Các ứng dụng có số lượng mã lớn có thể nhanh chóng lấp đầy phân đoạn này của heap, điều này sẽ gây ra java.lang.OutOfMemoryError: PermGen bất kể "-Xmx" của bạn (kích thước tối đa của vùng phân bổ bộ nhớ) và dung lượng bộ nhớ trên máy của bạn cao đến mức nào.

Kể tên một số phương pháp hay nhất liên quan đến Java Collection framework?


  • Việc chọn loại collection phù hợp để sử dụng, dựa trên nhu cầu của ứng dụng, là rất quan trọng đối với hiệu suất của nó. Ví dụ: nếu kích thước của các phần tử là cố định và biết trước, chúng ta sẽ sử dụng Array, thay vì ArrayList.
  • Một số collection-class cho phép chúng tachỉ định dung lượng ban đầu của chúng. Do đó, nếu chúng ta có ước tính về số lượng phần tử sẽ được lưu trữ, chúng ta có thể sử dụng nó để tránh rehashing hoặc resizing.
  • Luôn sử dụng Generics để đảm bảo an toàn cho type, dễ đọc và mạnh mẽ. Ngoài ra, bằng cách sử dụng Generics, bạn tránh được ClassCastException trong runtime.
  • Sử dụng các immutable-class được cung cấp bởi Java Development Kit (JDK) làm key trong Map, để tránh việc triển khai các phương thức hashCode và equals cho custom-class của chúng ta.
  • Trả về các collection hoặc mảng có độ dài bằng 0 thay vì trả về giá trị null trong trường hợp collection hoặc mảng không có phần tử nào.

Giải thích về Marshalling và Demarshalling?


Khi một ứng dụng muốn truyền các đối tượng bộ nhớ của nó qua network tới một máy chủ lưu trữ khác hoặc duy trì nó vào bộ nhớ, biểu diễn trong bộ nhớ phải được chuyển đổi sang một định dạng phù hợp. Quá trình này được gọi là marshalling và hoạt động hoàn ngược lại được gọi là demarshalling.

Sự khác biệt giữa các applet được tải qua internet và các applet được tải qua file system là gì?


  • Đối với trường hợp một applet được tải qua internet, applet được tải bởi Applet classloader và phải tuân theo các hạn chế do trình quản lý bảo mật applet thực thi.
  • Về trường hợp một applet được tải từ đĩa cục bộ (local disk) của client, applet được tải bởi File system loader. Applet được tải qua file system được phép đọc các file, ghi file và tải thư viện trên client.
  • Ngoài ra, các ứng dụng được tải qua file system được phép thực thi các process và cuối cùng, các ứng dụng được tải qua file system không được chuyển qua Byte code verifier (trình xác minh mã byte).

Binding trong RMI có nghĩa là gì?


  • Binding là quá trình liên kết hoặc đăng ký tên cho một đối tượng từ xa (remote object), có thể được sử dụng cho sau này, để tra cứu đối tượng từ xa đó.
  • Một đối tượng từ xa có thể được liên kết với một cái tên (name) bằng cách sử dụng các phương thức bind() hoặc rebind() của lớp Naming.

Hãy kể một trường hợp sử dụng Builder Design Pattern?


Ví dụ điển hình là một hệ thống phân cấp lớp mà nó bổ sung thêm nhiều tham số khi nó đi xuống chuỗi. Ở phía dưới, một số lớp có thể có tới N tham số, N-2 trong số đó chỉ được truyền vào hàm super constructor. Thay vì sử dụng một phương thức khởi tạo cụ thể với N tham số, chúng ta có thể sử dụng Builder Design Pattern.

public class StudentBuilder
{
   private String _name;
   private int _age = 14; // this has a default
   private String _motto = ""; // most students don't have one
   public StudentBuilder() { }
   public Student buildStudent()
   {
      return new Student(_name, _age, _motto);
   }
   public StudentBuilder name(String _name)
   {
      this._name = _name;
      return this;
   }
   public StudentBuilder age(int _age)
   {
      this._age = _age;
      return this;
   }
   public StudentBuilder motto(String _motto)
   {
      this._motto = _motto;
      return this;
   }
}

Điều này cho phép chúng ta viết code như sau:

Student s1 = new StudentBuilder().name("Eli").buildStudent();
Student s2 = new StudentBuilder()
.name("Spicoli")
.age(16)
.motto("Aloha, Mr Hand")
.buildStudent();

Sự khác biệt chính giữa một Non-static nested class và một Static nested class là gì?


Nói ngắn gọn, một Non-static nested class có thể truy cập instance của lớp vùng chứa, trong khi Static nested class thì không thể.

Một nested class (lớp lồng nhau) là một lớp được định nghĩa trong một lớp khác (lớp chứa) và có thể là static hoặc non-static. Một nested class chỉ nên tồn tại để phục vụ lớp chứa, nếu một nested class có hữu ích cho các lớp khác (không chỉ lớp chứa), thì nó nên được khai báo như các lớp bình thường khác.

  • Non-static Nested (Inner) class: được liên kết ngầm với instance bao quanh của lớp chứa, điều này có nghĩa là có thể gọi các phương thức và truy cập các biến của instance đó. Một cách sử dụng phổ biến của một non-static nested class là định nghĩa một Adapter class.
  • Static Nested class: không thể truy cập instance của lớp chứa và gọi các phương thức trên đó, vì vậy nên được sử dụng khi nested class không yêu cầu quyền truy cập vào một instance của lớp chứa. Một cách sử dụng phổ biến của static nested class là triển khai các thành phần của đối tượng bên ngoài.
Avatar Techmely Team
VIẾT BỞI

Techmely Team