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

Implicit objects của JSP có nghĩa là gì và chúng là gì?


Các implicit objects (đối tượng ngầm định) của JSP là các đối tượng Java mà JSP Container cung cấp cho các nhà phát triển trong mỗi trang. Nhà phát triển có thể gọi chúng trực tiếp mà không cần khai báo rõ ràng. Các implicit objects của JSP còn được gọi là các biến được định nghĩa trước, các đối tượng sau được coi là implicit trong một trang JSP:

  • application
  • page
  • request
  • response
  • session
  • exception
  • out
  • config
  • pageContext

Server Side Include (SSI) là gì?


  • Server Side Includes (SSI) là một ngôn ngữ script phía server được thông dịch đơn giản, được sử dụng hầu như chỉ dành cho web và được nhúng với thẻ servlet.
  • Việc sử dụng SSI thường xuyên nhất là include nội dung của một hoặc nhiều files vào một trang web trên một Web server. Khi một trang web được trình duyệt truy cập, Web server sẽ thay thế thẻ servlet trong trang web đó bằng hyper-text (siêu văn bản) được tạo bởi servlet tương ứng.

Tầm quan trọng của phương thức hashCode() và equals() là gì?


  • HashMap trong Java sử dụng phương thức hashCode và equals để xác định index của cặp key-value.
  • Các phương thức này cũng được sử dụng khi chúng ta yêu cầu value của một key cụ thể. Nếu các phương pháp này không được triển khai chính xác, hai key khác nhau có thể tạo ra cùng một hash value và do đó, sẽ được collection coi là equal (bằng nhau). Hơn nữa, các phương pháp này cũng được sử dụng để phát hiện các bản trùng nhau. Do đó, việc triển khai cả hai phương pháp đều rất quan trọng đối với tính chính xác và đúng đắn của HashMap.

Sự khác biệt giữa final, finalize và finally là gì?


  • final là một từ khóa Java được sử dụng để chỉ ra rằng một phương thức không thể ghi đè trong một lớp con, hoặc một lớp không thể được mở rộng (extend) hoặc một trường (field) không thể được sửa đổi.
  • finalize là một phương thức được gọi trên một instance của một Đối tượng khi nó được thu thập rác.
  • finally là một từ khóa Java được sử dụng trong xử lý exception để chỉ định một khối mã luôn được chạy cho dù một exception có được thảy ra hay không.

Giải thích vai trò của Driver trong JDBC?


JDBC Driver cung cấp các triển khai dành riêng cho nhà cung cấp của các abstract classes được cung cấp bởi JDBC API. Mỗi driver phải cung cấp các triển khai cho các lớp sau đây của gói java.sql:

  • Connection
  • Statement
  • PreparedStatement
  • CallableStatement
  • ResultSet
  • Driver

Trình bày vòng đời (life cycle) của một Applet?


Một applet có thể trải qua các trạng thái sau:

  • Init: Một applet được khởi tạo mỗi lần được load.
  • Start: Bắt đầu thực thi một applet.
  • Stop: Dừng việc thực thi một applet.
  • Destroy: Thực hiện dọn dẹp lần cuối trước khi unload applet đó.

Ưu điểm của JSP là gì?


Những lợi thế của việc sử dụng công nghệ JSP được thể hiện dưới đây:

  • Các trang JSP được biên dịch động thành các servlet và do đó, các nhà phát triển có thể dễ dàng cập nhật mã của bản trình bày.
  • Các trang JSP có thể được biên dịch trước.
  • Các trang JSP có thể dễ dàng kết hợp với các mẫu tĩnh (static templates), bao gồm các đoạn HTML hoặc XML với code để tạo ra nội dung động.
  • Các nhà phát triển có thể cung cấp các thư viện thẻ JSP tùy chỉnh được sử dụng bằng cú pháp giống như XML.
  • Các nhà phát triển có thể thực hiện các thay đổi logic ở cấp component mà không cần chỉnh sửa các trang riêng lẻ sử dụng logic của ứng dụng.

Java có hỗ trợ đa kế thừa không?


Không, Java không hỗ trợ đa kế thừa. Mỗi class chỉ có thể extend một class, nhưng có thể triển khai nhiều hơn một interfaces.

Ưu điểm của PreparedStatement so với Statement là gì?


PreparedStatements được biên dịch trước và do đó, hiệu suất của chúng tốt hơn nhiều. Ngoài ra, các đối tượng PreparedStatement có thể được sử dụng lại với các giá trị đầu vào khác nhau cho các truy vấn của chúng.

Sự khác biệt giữa public, protected, package private và private trong Java là gì?


  • Private - Như bạn nghĩ, chỉ lớp mà nó được khai báo mới có thể nhìn thấy nó.
  • Package Private - Chỉ có thể được nhìn thấy và sử dụng bởi package mà nó đã được khai báo. Đây là mặc định trong Java (mà một số người coi là mistake).
  • Protected - Package Private + có thể được nhìn thấy bởi các lớp con hoặc thành viên package.
  • Public - Mọi người đều có thể thấy.

image

Khởi tạo tĩnh (static initializer) là gì?


Khởi tạo tĩnh là một khối mã static{} bên trong lớp java và chỉ chạy một lần trước khi phương thức khởi tạo hoặc phương thức chính được gọi. Nếu bạn phải thực hiện một phép tính phức tạp để xác định giá trị của x - hoặc nếu giá trị của nó đến từ cơ sở dữ liệu - thì trình khởi tạo tĩnh có thể rất hữu ích.

class StaticInit {
   public static int x;
   static {
      x = 32;
   }
   // other class members such as constructors and
   // methods go here...
}

Untrusted applets là gì?


Các untrusted applets (applet không đáng tin cậy) là những Java applets không thể truy cập hoặc thực thi các file hệ thống cục bộ. Theo mặc định, tất cả các applet đã tải xuống được coi là untrusted.

Từ khóa volatile dùng để làm gì?


Volatile có ý nghĩa cho việc hiển thị bộ nhớ. Về cơ bản, giá trị của một trường volatile sẽ hiển thị cho tất cả readers (cụ thể là các threads khác) sau khi hoàn thành thao tác ghi trên đó. Nếu không có volatile, các readers có thể thấy một số giá trị không được cập nhật.

Lợi ích của việc sử dụng getters và setters là gì?


  • Đóng gói hành vi liên quan đến việc get hoặc set thuộc tính - điều này cho phép thêm các chức năng bổ sung (như xác thực - validation) sau này dễ dàng hơn.
  • Ẩn phần đại diện bên trong của thuộc tính trong khi hiển thị thuộc tính bằng cách sử dụng hình thức đại diện thay thế.
  • Ngăn chặn public-interface của bạn khỏi sự thay đổi - cho phép public-interface không đổi khi việc triển khai thay đổi mà không gây ảnh hưởng đến người dùng hiện tại.
  • Kiểm soát thời gian tồn tại và việc quản lý bộ nhớ của thuộc tính - đặc biệt quan trọng trong môi trường bộ nhớ không được quản lý (như C ++ hoặc Objective-C).
  • Cung cấp một điểm chặn debugging khi một thuộc tính thay đổi trong runtime - việc debugging một thuộc tính khi nào và ở đâu được thay đổi thành một giá trị cụ thể có thể khá - khó khăn nếu không có điều này trong một số ngôn ngữ.
  • Cải thiện khả năng tương tác với các thư viện được thiết kế để hoạt động chống lại thuộc tính getters / setters – ví dụ: Mocking, Serialization và WPF.
  • Cho phép người kế thừa thay đổi ngữ nghĩa của cách thuộc tính hoạt động và được hiển thị bằng cách ghi đè các phương thức getter / setter.
  • Cho phép getter / setter được chuyển dưới dạng biểu thức lambda chứ không phải giá trị.
  • Getters và setters có thể cho phép các cấp độ truy cập khác nhau - ví dụ: get có thể là public, nhưng set có thể là protected.
  • Cho phép lazy loading.
  • Cho phép sao chép khi ghi (copy on write).

Sự khác biệt giữa Iterator và ListIterator?


Sự khác biệt của hai yếu tố này được liệt kê dưới đây:

  • Một Iterator có thể được sử dụng để duyệt qua các tập hợp Set và List, trong khi ListIterator chỉ có thể được sử dụng để lặp qua List.
  • Iterator chỉ có thể duyệt qua một tập hợp theo một hướng tới (forward direction), trong khi ListIterator có thể duyệt một List theo cả hai hướng.
  • ListIterator triển khai Iterator interface và chứa các chức năng bổ sung, chẳng hạn như thêm một phần tử, thay thế một phần tử, lấy vị trí chỉ mục cho các phần tử trước và sau,...

Dấu "..." trong các tham số của phương thức có nghĩa là gì?


Dấu "..." trong phương thức sau có ý nghĩa gì?

public void myMethod(String... strings){
   // method body
}

Tính năng đó được gọi là varargs, được giới thiệu trong Java 5. Điều đó có nghĩa là hàm có thể nhận nhiều đối số String:

myMethod("foo", "bar");
myMethod("foo", "bar", "baz");
myMethod(new String[]{"foo", "var", "baz"}); // you can eve

Sau đó, bạn có thể sử dụng "strings" như một mảng:

public void myMethod(String... strings){
   for(String whatever : strings){
      // do what ever you want
   }
   // the code above is is equivalent to
   for( int i = 0; i < strings.length; i++){
      // classical for. In this case you use strings[i]
   }
}

Các phương thức Swing nào là thread-safe?


Chỉ có ba phương thức là thread-safe:

  • repaint
  • revalidate
  • invalidate
Avatar Techmely Team
VIẾT BỞI

Techmely Team