Ghi chép của hoanglien304
Câu hỏi phỏng vấn lập trình viên Java (phần 3)
Nhà tuyển dụng: Sự khác nhau giữa JDK và JRE?
Ứng viên: JDK là viết tắt của Java Development Kit (Bộ công cụ phát triển ứng dụng Java). JRE là viết tắt của Java Runtime Environment (Môi trường thực thi Java). JDK dành cho nhà phát triển, JRE dành cho người dùng cuối (người sử dụng sản phẩm do nhà phát triển tạo ra). JDK đã bao gồm cả JRE, bởi vì rất hiển nhiên, Nhà phát triển sau khi tạo ra ứng dụng với công cụ trợ giúp là JDK thì phải chạy được nó để thử nghiệm. Sau khi cài đặt JDK thì trong thư mục cài đặt (JAVA_HOME) có thư mục chứa JRE. Các tính năng JDK có mà JRE không có là: Biên dịch mã nguồn *.java thành *.class, xuất ra javadoc, đóng gói ứng dụng, gỡ lỗi (debug) v.v..
Nhà tuyển dụng: Đối tượng trong Java mang giá trị là kết quả việc gán giá trị. Việc gán giá trị là “truyền giá trị tham chiếu” (pass-by-reference) hay “truyền giá trị tham trị” (pass-by-value), hay áp dụng cả 2 cách?
Ứng viên: Về mặt ngữ nghĩa, “trị” là “giá trị” (value), “tham chiếu” là reference. Java chỉ truyền giá trị theo một kiểu là tham trị. Java không dùng con trỏ (pointer) như C++ (C++ cho phép truyền giá trị theo cách tham chiếu). Ví dụ dưới đây sẽ minh họa rất trực quan cơ chế truyền giá trị trong Java
Giả sử Java truyền giá trị theo kiểu tham chiếu (pass-by-reference) thì chương trình trền sẽ in ra kết quả là “SmartJob”, bởi vì phương thức gán giá trị foo() được gọi ra. Sự thật chương trình in ra chuỗi “Hello”, nghĩa là phương thức foo() không tác động đến biến baz trong phương thức main của chương trình. Java gán giá trị theo kiểu tham trị (pass-by-value), và luôn luôn là như vậy.
Nhà tuyển dụng: Phần mềm quản lý nhân sự của SmartJob tính lương cho nhân viên theo công thức phức tạp dựa trên số ngày công, năng lực, số năm kinh nghiệm, v.v.. của mỗi người. Trong phần mềm, Lương tháng của mỗi nhân viên được tính và ghi vào biến salary. Kiểu dữ liệu của biến salary nên là gì sẽ tốt nhất (best practice)?
Ứng viên: Việc tính toán với tiền bạc (tiền tệ) luôn cần sự chính xác cao, đảm bảo sai số (nếu có) ở mức ổn định và kiểm soát được. Lương của nhân viên là biến salary, tốt nhất để kiểu BigDecimal (java.math.BigDecimal).
Không sử dụng kiểu dữ liệu số nguyên không dấu: Tiền lương có thể liên quan đến nhiều loại tiền tệ như Việt Nam Đồng, Đô la Mỹ. Tính toán trên tiền lương không chỉ có các phép cộng, có thể phát sinh các phép trừ (do vi phạm, bị phạt), tạm ứng, dẫn đến có thể phát sinh giá trị âm.
Tính lương liên quan đến các phép tính lấy % (% giảm trừ gia cảnh theo phần trăm thu nhập, % đóng phí bảo hiểm v.v..), phép chia, do đó có phần lẻ thập phân. Kiểu dữ liệu số nguyên không lưu giữ được phần thập phân sau khi của các phép chia. Nếu sử dụng kiểu số thực float, sai số tích lũy tăng dần theo số phép tính nhân/chia. Và BigDecimal là kiểu dữ liệu tốt nhất cho các đối tượng liên quan đến tiền tệ.
Nhà tuyển dụng: Sự khác nhau giữa Array và ArrayList? Khi nào thì bạn sử dụng Array thay cho ArrayList?
Ứng viên: Những điểm khác nhau cơ bản giữa Array và ArrayList là:
* Array có thể chứa kiểu dữ liệu nguyên thủy (primitive) hoặc đối tượng (object), trong khi ArrayList chỉ có thể chứa đối tượng (object).
* Array có kích thước cố định, ArrayList có kích thước động.
* ArrayList cung cấp nhiều phương thức (cũng là các tính năng) như addAll, removeAll, iterator, v.v..
Nhà tuyển dụng: Trong Java có bao nhiêu kiểu dữ liệu nguyên thủy? Liệt kê các kiểu dữ liệu này.
Ứng viên: Trong Java có 8 kiểu dữ liệu nguyên thủy là: byte, short, int, long, float, double, boolean, char.
Nhà tuyển dụng: Thế nào là static block (khối lệnh tĩnh trong class Java và có từ khóa static đứng trước, line 5-7 trong ví dụ)? Ví dụ xem bên dưới và cho biết kết quả chạy chương trình?
0 bình luận