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

Phương thức System.gc() và Runtime.gc() làm gì?


Các phương thức này có thể được sử dụng như một gợi ý cho JVM, để bắt đầu thu gom rác. Tuy nhiên, điều này phụ thuộc vào Java Virtual Machine (JVM) để bắt đầu thu gom rác ngay lập tức hoặc chậm hơn.

Mục đích của việc thu gom rác trong Java là gì?


Mục đích của việc thu gom rác (garbage collection) là để xác định và loại bỏ những đối tượng không còn cần thiết của ứng dụng, để các tài nguyên được lấy lại và sử dụng lại.

Design pattern mà Java sử dụng cho tất cả các Swing components là gì?


Design pattern được Java sử dụng cho tất cả các Swing components là Model View Controller (MVC).

Các JSP requests được xử lý như thế nào?


Khi có JSP request, trước tiên trình duyệt gọi một trang có extension là .jsp. Sau đó, Web server đọc request và sử dụng trình biên dịch JSP, Web server chuyển đổi trang JSP thành một lớp servlet. Lưu ý rằng tệp JSP chỉ được biên dịch theo request đầu tiên của trang hoặc nếu tệp JSP được thay đổi. Lớp servlet đã tạo sẽ được gọi để xử lý request của trình duyệt. Khi quá trình thực thi request kết thúc, servlet sẽ gửi phản hồi trở lại client.

Iterator trong Java là gì?


Iterator interface cung cấp một số phương thức có thể lặp qua bất kỳ Collection nào. Mỗi Java Collection chứa phương thức Iterator trả về một instance của Iterator. Các trình lặp có khả năng xóa các phần tử khỏi tập hợp cơ bản trong quá trình lặp.

Pass by reference và pass by value là gì?


Khi một đối tượng được pass by value (truyền bằng giá trị), điều này có nghĩa là một bản sao của đối tượng được truyền. Do đó, ngay cả khi các thay đổi được thực hiện đối với đối tượng đó, nó cũng không ảnh hưởng đến giá trị ban đầu.

Khi một đối tượng được pass by reference (truyền bằng tham chiếu), điều này có nghĩa là đối tượng thực tế không được truyền, đúng hơn là một tham chiếu của đối tượng được truyền. Vì vậy, bất kỳ thay đổi nào được thực hiện trên đối tượng đó, cũng sẽ ảnh hưởng đến đối tượng ban đầu.

Java Applet là gì?


  • Java Applet là chương trình có thể được đưa vào trang HTML và được thực thi trong trình duyệt client hỗ trợ java.
  • Java Applet được sử dụng để tạo các ứng dụng web động và tương tác.

Directives là gì? Kể tên các loại directives khác nhau có trong Java?


Directives là các chỉ dẫn được xử lý bởi JSP engine, khi trang được biên dịch thành một servlet. Các directives được sử dụng để cài đặt các chỉ dẫn cấp trang, chèn dữ liệu từ các file bên ngoài và chỉ định các thư viện thẻ tùy chỉnh. Directives được xác định giữa <%@ và %>.

Có 3 loại directives khác nhau:

  • Include directive: được sử dụng để bao gồm một file và hợp nhất nội dung của file với trang hiện tại.
  • Page directive: được sử dụng để xác định các thuộc tính cụ thể trong trang JSP, như Error page và buffer (bộ đệm).
  • Taglib: được sử dụng để khai báo thư viện thẻ tùy chỉnh (custom tag library) được sử dụng trong trang.

Làm sao Garbage Collection ngăn ứng dụng Java tràn bộ nhớ?


Garbage Collection không ngăn ứng dụng Java tràn bộ nhớ! Garbage Collection chỉ đơn giản là dọn dẹp bộ nhớ không sử dụng khi một đối tượng vượt ra khỏi phạm vi và không còn cần dùng nữa. Tuy nhiên, một ứng dụng có thể tạo ra một số lượng lớn các đối tượng gây ra lỗi OutOfMemoryError.

Sự khác biệt chính giữa StringBuffer và StringBuilder là gì?


  • StringBuffer được đồng bộ hóa, StringBuilder thì không. Khi một số thứ được đồng bộ hóa, thì đa luồng có thể truy cập và sửa đổi nó mà không gặp bất kỳ sự cố hoặc tác dụng phụ nào. StringBuffer được đồng bộ hóa, vì vậy bạn có thể sử dụng nó với đa luồng mà không gặp bất kỳ sự cố nào.
  • StringBuilder nhanh hơn StringBuffer vì nó không được đồng bộ hóa. Sử dụng các phương thức đồng bộ hóa trong một thread đơn là quá mức cần thiết.

Sự khác biệt giữa ArrayList và LinkedList là gì?


Cả hai lớp ArrayListLinkedList đều triển khai List interface, nhưng chúng khác nhau về các tính năng sau:

  • ArrayList là một cấu trúc dữ liệu dựa trên index được hỗ trợ bởi một Array. Nó cung cấp quyền truy cập ngẫu nhiên vào các phần tử của nó với hiệu suất bằng O(1). Mặt khác, LinkedList lưu trữ dữ liệu của nó dưới dạng danh sách các phần tử và mọi phần tử đều được liên kết với phần tử trước đó và tiếp theo của nó. Trong trường hợp này, thao tác tìm kiếm một phần tử có thời gian thực hiện bằng O(n).
  • Thao tác Chèn, Thêm và Xóa phần tử trong LinkedList nhanh hơn so với ArrayList, vì không cần thay đổi kích thước mảng hoặc cập nhật index khi phần tử được thêm vào một số vị trí tùy ý bên trong collection.
  • LinkedList tiêu tốn nhiều bộ nhớ hơn ArrayList, bởi vì mỗi nút trong LinkedList đều lưu trữ hai tham chiếu, một cho phần tử trước đó và một cho phần tử tiếp theo của nó.

Sự khác biệt giữa GenericServlet và HttpServlet là gì?


  • GenericServlet là một servlet tổng quát và không phụ thuộc vào giao thức (protocol), triển khai các Servlet interfaces và ServletConfig interfaces. Các servlet extend lớp GenericServlet sẽ ghi đè (override) service method.
  • Cuối cùng, để phát triển một HTTP servlet phục vụ các yêu cầu sử dụng giao thức HTTP trên web, servlet của bạn cần phải extend HttpServlet.

Cấu trúc của Java Heap là gì?


  • JVM có một heap là vùng dữ liệu runtime mà từ đó làm bộ nhớ cho tất cả các instance của các class và mảng được cấp phát. Nó được tạo khi khởi động JVM.
  • Heap memory của các đối tượng được thu lại bởi một hệ thống quản lý bộ nhớ tự động được gọi là bộ thu gom rác (garbage collector).
  • Heap memory bao gồm các đối tượng sống và chết.
  • Các đối tượng sống còn được truy cập bởi ứng dụng sẽ không phải là đối tượng thu gom rác.
  • Các đối tượng chết là những đối tượng sẽ không bao giờ có thể truy cập được bởi ứng dụng, nhưng vẫn chưa được bộ thu gom rác thu thập. Các đối tượng như vậy chiếm không gian bộ nhớ heap cho đến khi chúng được bộ thu gom rác thu thập.

Enum là thread-safe như thế nào trong Java?


Việc tạo một enum được đảm bảo là thread-safe. Tuy nhiên, các phương thức trên một kiểu enum không nhất thiết phải là thread-safe.

Sự khác biệt giữa Enumeration interface và Iterator interface là gì?


  • Enumeration nhanh hơn gấp đôi so với một Iterator và sử dụng rất ít bộ nhớ. Tuy nhiên, Iterator an toàn hơn nhiều so với Enumeration, vì các threads khác không thể sửa đổi đối tượng collection đang được duyệt qua bởi iterator.
  • Ngoài ra, các Iterators cho phép người gọi xóa các phần tử khỏi collection, một điều không thể thực hiện được với Enumeration.

Sự khác biệt giữa == và equals là gì?


Cần phải nói rằng thông thường thì, == KHÔNG phải là một thay thế khả thi cho equals. Tuy nhiên, khi nó xảy ra (chẳng hạn như với enum), có hai điểm khác biệt quan trọng cần xem xét:

  1. == không bao giờ ném ra NullPointerException
enum Color { BLACK, WHITE };

Color nothing = null;
if (nothing == Color.BLACK); // runs fine
if (nothing.equals(Color.BLACK)); // throws NullPointerEx
  1. == có thể kiểm tra tính tương thích của type tại thời điểm biên dịch
enum Color { BLACK, WHITE };
enum Chiral { LEFT, RIGHT };

if (Color.BLACK.equals(Chiral.LEFT)); // compiles fine
if (Color.BLACK == Chiral.LEFT); // DOESN'T COMPILE!!! Incompatible types!

JavaBean chính xác là gì?


Về cơ bản, "Bean" tuân theo tiêu chuẩn:

  • Là một đối tượng có thể tuần tự hóa (serializable object) (nghĩa là, nó triển khai java.io.Serializable và làm như vậy một cách chính xác).
  • Có các "thuộc tính" mà getterssetters chỉ là các phương thức với một số tên nhất định (chẳng hạn như getFoo() là getter cho thuộc tính "Foo").
  • Có một phương thức khởi tạo 0-arg (public) (vì vậy nó có thể được tạo theo ý muốn và được cấu hình bằng cách thiết lập các thuộc tính của nó).

Không có sự khác biệt về cú pháp giữa JavaBean và một lớp khác - một lớp là JavaBean nếu nó tuân theo các tiêu chuẩn trên.

Sự khác biệt giữa doGet() và doPost() là gì?


doGET: phương thức GET thêm các cặp name-value trên URL của request. Do đó, có giới hạn về số lượng ký tự (IE là 2083 ký tự, Chrome là 2MB, vì vậy khuyến cáo rằng nếu bạn sử dụng số lượng ký tự tối đa là 2000 thì sẽ phù hợp có tất cả các trình duyệt hiện đại), cho nên cũng sẽ giới hạn số lượng giá trị có thể được sử dụng trong request của client. Hơn nữa, các giá trị của request sẽ được hiển thị và do đó, thông tin nhạy cảm không nên được truyền theo cách trên.

doPOST: phương thức POST vượt qua giới hạn được áp đặt bởi yêu cầu GET, bằng cách gửi các giá trị của request bên trong phần body của nó. Ngoài ra, không có giới hạn về số lượng giá trị được gửi qua. Cuối cùng, thông tin nhạy cảm được chuyển qua một yêu cầu POST sẽ không hiển thị với client bên ngoài.

Avatar Techmely Team
VIẾT BỞI

Techmely Team