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

Java Classloader là gì?


Java Classloader là một phần của môi trường Java runtime sẽ tải các class theo yêu cầu (lazy loading) vào JVM (Java Virtual Machine). Các class có thể được tải từ local file system (hệ thống tệp cục bộ), remote file system (hệ thống tệp từ xa) hoặc thậm chí trên web.

Sự khác biệt giữa HashMap, LinkedHashMap và TreeMap trong Java?


Cả ba lớp đều triển khai Map interface và cung cấp hầu hết các chức năng giống nhau. Sự khác biệt quan trọng nhất là thứ tự lặp lại qua các phần tử sẽ xảy ra:

  • HashMap hoàn toàn không đảm bảo về thứ tự lặp lại. Nó có thể (và sẽ) thay đổi hoàn toàn khi các phần tử mới được thêm vào.
  • TreeMap sẽ lặp lại theo "thứ tự tự nhiên" của các khóa theo phương thức CompareTo() của chúng (hoặc một Comparator được cung cấp từ bên ngoài). Ngoài ra, nó triển khai - SortedMap interface, trong đó có các phương thức phụ thuộc vào thứ tự sắp xếp này.
  • LinkedHashMap sẽ lặp lại theo thứ tự mà các phần tử được nhập vào map.

Khối finally khác phương thức finalize() như thế nào?


  • Một khối finally sẽ được thực thi cho dù có thảy ra exception hay không và được sử dụng để giải phóng các tài nguyên do ứng dụng nắm giữ.
  • Finalize là một phương thức protected của lớp Object, được gọi bởi Java Virtual Machine (JVM) ngay trước khi một đối tượng được giải phóng bộ nhớ (hay gọi là bị thu gom rác).

Connection pooling có nghĩa là gì?


Việc tương tác với cơ sở dữ liệu có thể tốn kém, liên quan đến việc mở và đóng các kết nối cơ sở dữ liệu. Đặc biệt, khi số lượng cơ sở dữ liệu của client tăng lên, chi phí này rất cao và tiêu tốn một lượng lớn tài nguyên.

Một nhóm các kết nối cơ sở dữ liệu được máy chủ ứng dụng thu được khi khởi động và được duy trì trong Connection pooling (vùng kết nối). Một yêu cầu kết nối được thực hiện bởi một kết nối nằm trong Connection pooling. Khi kết thúc kết nối, yêu cầu được trả về Connection pooling và có thể được sử dụng để đáp ứng các yêu cầu trong tương lai.

Một kết nối trong Connection pooling chỉ bị đóng khi hết thời gian timeout.

Giải thích các trạng thái của thread ở một high-level?


Trong quá trình thực thi, một thread có thể nằm ở một trong các trạng thái sau:

  • Runnable: một thread sẵn sàng chạy, nhưng không nhất thiết phải bắt đầu chạy ngay lập tức.
  • Running: bộ xử lý đang tích cực thực thi thread code.
  • Waiting: một thread đang ở trạng thái bị khóa để chờ một số tiến trình xử lý bên ngoài kết thúc.
  • Sleeping: thread buộc phải ngủ.
  • Blocked on I/O: đang chờ thao tác I / O hoàn tất.
  • Blocked on Synchronization: đang đợi để có được khóa.
  • Dead: thread đã hoàn thành quá trình thực thi.

Double Brace initialization trong Java là gì?


Double Brace initialization (khởi tạo dấu ngoặc kép) tạo ra một anonymous class (lớp ẩn danh) có nguồn gốc từ lớp được chỉ định (các dấu ngoặc nhọn bên ngoài) và cung cấp một khối khởi tạo bên trong lớp đó (các dấu ngoặc nhọn bên trong), ví dụ.

new ArrayList<Integer>() {{
   add(1);
   add(2);
}};

Tuy nhiên, tôi không quá thích phương thức đó vì những gì bạn kết thúc là một lớp con của ArrayList có một bộ khởi tạo instance và lớp đó được tạo ra chỉ để tạo một đối tượng - điều đó có vẻ hơi quá mức cần thiết đối với tôi.

Làm thế nào để bạn biết được client nào đang thực hiện yêu cầu đối với servlet của bạn?


Lớp ServletRequest có các chức năng để tìm ra địa chỉ IP hoặc tên máy chủ của client. getRemoteAddr() lấy địa chỉ IP của client và getRemoteHost() lấy tên máy chủ của client.

package com.javacodegeeks.snippets.enterprise;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GetClientAddressAndHostnameInServlet extends HttpServlet {

    private static final long serialVersionUID = -2128122335811219481L;

    public void doGet(HttpServletRequest req, HttpServletResponse res)
     throws IOException {

        PrintWriter out = res.getWriter();
        res.setContentType("text/plain");

        // client's IP address
        String remoteAddr = req.getRemoteAddr();

        // client's hostname
        String remoteHost = req.getRemoteHost();

        out.write("remoteAddr = ");
        out.write(remoteAddr);
        out.write("n");
        out.write("remoteHost = ");
        out.write(remoteHost);

        out.close();
    }
}

Marker interface trong Java chính xác là gì?


  • Marker interface trong Java là giao diện không có thuộc tính hoặc phương thức. Nói cách khác, một giao diện trống trong java được gọi là marker interface. Một ví dụ về marker interface là Serializable, ClonableRemote interface.
  • Marker interface được sử dụng như một thẻ để thông báo một tin nhắn tới trình biên dịch java để nó có thể thêm hành vi đặc biệt vào lớp thực thi nó.

Java có hỗ trợ các giá trị mặc định cho tham số không?


Không. Chúng ta có thể sử dụng overloading thay vì các tham số mặc định như:

public MyParameterizedFunction(String param1, int param2)
{
   this(param1, param2, false);
}

public MyParameterizedFunction(String param1, int param2, boolean param3)
{
   //use all three parameters here
}

Làm sao để bạn đảm bảo N thread có thể truy cập N tài nguyên mà không bị deadlock?


Một cách rất đơn giản để tránh deadlock khi sử dụng N thread là áp đặt thứ tự cho các khóa và buộc mỗi thread tuân theo thứ tự đó. Do đó, nếu tất cả các thread khóa và mở khóa các mutex theo cùng một thứ tự, không có deadlock nào có thể phát sinh.

Sự khác biệt giữa Serial garbage collector and Throughput garbage collector là gì?


  • Throughput garbage collector sử dụng phiên bản song song của Young generation collector (bộ thu thập thế hệ trẻ) và được sử dụng với các ứng dụng có tập dữ liệu từ trung bình đến lớn.
  • Mặt khác, Serial garbage collector thường đủ cho hầu hết các ứng dụng nhỏ (những ứng dụng yêu cầu xấp xỉ 100MB trên bộ vi xử lý hiện đại).

Vai trò của lớp java.rmi.Naming là gì?


Lớp java.rmi.Naming chứa một phương thức để liên kết, hủy liên kết hoặc tái liên kết các tên với một đối tượng từ xa (remote object) hiện diện trong Remote registry. Lớp này cũng được sử dụng để lấy tham chiếu của đối tượng có trong Remote registry hoặc danh sách tên được liên kết với Remote registry này.

Một số phương thức thường dùng của lớp java.rmi.Naming:

  • bind()
  • list()
  • lookup()
  • rebind()
  • unbind()

Mục đích của việc sử dụng RMISecurityManager trong RMI là gì?


RMISecurityManager cung cấp một trình quản lý bảo mật có thể được sử dụng bởi các ứng dụng RMI, ứng dụng sử dụng mã đã tải xuống. Classloader của RMI sẽ không tải xuống bất kỳ lớp nào từ các vị trí từ xa (remote locations), nếu trình quản lý bảo mật này chưa được thiết lập.

Sự khác biệt giữa HashMap và Hashtable trong Java là gì?


  • Hashtable được đồng bộ hóa, trong khi HashMap thì không. Điều này làm cho HashMap tốt hơn cho các ứng dụng không phân luồng, vì các đối tượng không được đồng bộ hóa thường hoạt động tốt hơn các đối tượng được đồng bộ hóa.
  • Hashtable không cho phép các key hoặc value là null. HashMap cho phép chỉ được một key là null và value có thể null tùy ý.
  • Một trong các lớp con của HashMap là LinkedHashMap, vì vậy trong trường hợp bạn muốn biết được thứ tự lặp (theo mặc định là thứ tự chèn), bạn có thể dễ dàng hoán đổi HashMap cho một LinkedHashMap. Điều này sẽ không dễ dàng nếu bạn đang sử dụng Hashtable.

Tại sao nên sử dụng char[] cho mật khẩu thay vì String?


  • Các String là immutable (bất biến). Điều đó có nghĩa là một khi bạn đã tạo String, nếu một process khác có thể sử dụng bộ nhớ, bạn sẽ không có cách nào (ngoài việc reflection) có thể loại bỏ dữ liệu trước khi quá trình thu gom rác bắt đầu.
  • Với một array, bạn có thể xóa dữ liệu một cách rõ ràng sau khi bạn hoàn tất với nó. Bạn có thể ghi đè array bằng bất kỳ thứ gì bạn thích và mật khẩu sẽ không hiện diện ở bất kỳ đâu trong hệ thống, ngay cả trước khi thu gom rác.
Avatar Techmely Team
VIẾT BỞI

Techmely Team