Tiếp theo phần 2. Chúng ta tiếp tục đến với phần 3 loạt các câu hỏi phỏng vẫn khi bạn tham gia tuyển dụng lập trình viên Java, giúp bạn tự tin và ghi điểm với các nhà tuyển dụng.
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<span style=“color: #333333;”><code class=“Java”>package com.smartJob.demo;
public class PassBy {
private static void foo(String bar) {
bar = “SmartJob”;
}
public static void main(String[] args) {
String baz = “Hello”;
foo(baz);
System.out.println(baz);
}
}</code></span>
|
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?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<span style=“color: #333333;”><code class=“java”>package com.smartJob.demo;
public class Test {
static{
System.out.println(“Static”);
}
{
System.out.println(“Non-static block”);
}
public static void main(String[] args) {
Test t = new Test();
Test t2 = new Test();
}
}</code></span>
|
Ứng viên: static-block dùng để khởi tạo các thành phần dữ liệu tĩnh, khối lệnh này được gọi đến mỗi khi class thực thi, thậm chí nó luôn thực thi trước cả phương thức main. Chương trình đã cho trả về như sau
1
2
3
|
<span style=“color: #333333;”><code class=“Java”>Static
Non–static block
Non–static block</code></span>
|
Nhà tuyển dụng: Thế nào là non-static block (khối lệnh trong class Java được bao bởi cặp dấu mở ngoặc nhọn, đóng ngoặc nhọn {}, line 9-11 trong ví dụ)? Ví dụ xem bên dưới và cho biết kết quả chạy chương trình?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<span style=“color: #333333;”><code class=“java”>package com.smartJob.demo;
public class Test {
static{
System.out.println(“Static”);
}
{
System.out.println(“Non-static block”);
}
public static void main(String[] args) {
Test t = new Test();
Test t2 = new Test();
}
}</code></span>
|
Ứng viên: non-static block được gọi đến khi khởi tạo đối tượng (chứ không phải khi gọi đến class).
1
2
3
|
<span style=“color: #333333;”><code class=“Java”>Static
Non–static block
Non–static block</code></span>
|
Ban biên tập nội dung SmartJob: Có một mẹo giúp bạn hiểu rõ về cơ chế gọi khối lệnh static-block và non-static-block, bạn hãy đặt debug tại 3 vị trí: Vị trí câu lệnh đầu tiên trong khối static-block (line 6), vị trí câu lệnh đầu tiên trong khối non-static block (line 10), vị trí câu lệnh đầu tiên trong phương thức main (line 14). Nếu bạn dùng Netbeans IDE, chạy chương trình ở chế độ debug, bấm F8 để xem luồng đi, thứ tự gọi lệnh của chương trình. Mọi thứ sẽ trực quan ngay trước mắt bạn. (Lưu ý: trong quá trình phỏng vấn, bạn không được dùng máy tính. Hãy chuẩn bị trước ở nhà).

Debug chương trình có static block và non-static block
Nhà tuyển dụng: Phương thức java.lang.Integer.parseInt(String s) trả về cái gì?
Ứng viên: Phương thức này lấy giá trị xâu ký tự, giá trị trả về là kiểu dữ liệu số nguyên – nguyên thủy (primitive data type) int. Ví dụ:
1
2
3
4
5
6
7
8
|
<span style=“color: #333333;”><code class=“java”>package com.smartJob.demo;
public class Parsing {
public static void main(String[] args) {
System.out.println(Integer.parseInt(“42”));
}
}</code></span>
|
In ra màn hình: 42 .
Nhà tuyển dụng: Để xử lý exception, dùng các khối try… catch… finally. Có tồn tại các khối lệnh try lồng nhau không?
Ứng viên: Có.
Nhà tuyển dụng: class java.util.Locale dùng để làm gì?
Ứng viên: Dùng để xử lý các vấn đề liên quan đến địa lý, chính trị, vùng miền, đa ngôn ngữ v.v..
Tải về project sử dụng trong bài viết: PassBy.
Nếu bạn có vướng mắc liên quan đến nội dung bài viết, đừng ngần ngại, hãy comment phía dưới.
Đỗ Như Vý – developer tại SmartJob
Mời các bạn đọc tiếp phần 4
Array,
ArrayList,
data type,
debug,
java,
JDK,
JRE,
non-static block,
pass by reference,
pass by value,
static block,