Java Core
Đây là phần 1 của bài thi test đầu vào của bank đỏ chữ T.
Chắc với các bạn làm từ 3 hay 4 năm trở lên không có khó khăn gì phần này. Vào vấn đề chính luôn nhé. Ai thi OCA/OCP thì quá quen dạng đề thi rồi.
Question 1:
You are given a list of class declarations. Identify the class that will compile and use a default constructor
Bạn được cung cấp một danh sách các khai báo lớp. Hãy xác định lớp nào sẽ biên dịch thành công và sử dụng constructor mặc định (default constructor).
A.
public class Demo {
void Demo() {}
}
B.
public class Demo {
private Demo() {}
}
C.
public class Demo {
public Demo(String name) {}
}
D.
public class Demo {
public Demo() {}
}
Nhìn thoáng qua chắc các bạn cũng biết chắc đó là D rồi đúng không. Nhưng xem các câu trả lời kia sao sai:
A.
void Demo() không phải constructor
Constructor không có kiểu trả về, còn cái này có void → nó là method bình thường
B.
Cú pháp tuy hợp lệ, nhưng đây là bạn đã tự khai báo constructor
=> Java KHÔNG tạo default constructor nữa
C.
Constructor có tham số
→ Java không tạo default constructor
D.
Đây là bạn tự khai báo tuy nhiên nó rất giống default constructor nên chọn D
Question 2:
What will be the output of the following code snippet?
Đoạn code sau sẽ cho ra kết quả (output) là gì?
Double d1 = new Double(124.384);
Double d2 = new Double(124.384123456789);
try {
int x = d2.compareTo(d1);
System.out.println(x);
} catch (ClassCastException e) {
System.out.println("ClassCast Exception is thrown");
}
Choose the corect option
- A. 2
- B. 1
- C. A compile time error
- D. A ClassCastException will be thrown
Khuyến cáo vì đây là câu hỏi Java 8 cũng cũ rồi: 'Double(double)' đã bị deprecated (không khuyến khích sử dụng) kể từ phiên bản 9 và được đánh dấu để loại bỏ trong tương lai.
Nếu thực tế thì nên khai báo:
Double d = Double.valueOf(1.23);
hoặc
Double d = 1.23; // autoboxing
Trả lời cho câu hỏi này thì phải hiểu hàm compareTo đã:
(Double) d2.compareTo((Double) d1)
=1 nếu d2 > d1
=0 nếu bằng nhau
=-1 nếu d2 < d1
Vậy chọn B
Question 3:
What distinguishes an "object class definition" from an "object instance?"
- An object class definition is where you store all the different instances of an object.
- An object class definition is run by the computer to create new instances of that object type
- An object class definition calls all the different methods on an object instance to update its state.
- An object class definition is a blueprint for the related attributes and behavior that the individual object instances will have.
Điều gì phân biệt giữa “định nghĩa lớp (class)” và “thể hiện đối tượng (object instance)”?
Định nghĩa lớp đối tượng là nơi bạn lưu trữ tất cả các thể hiện khác nhau của một đối tượng.
-> Câu này sai
Class không phải nơi lưu trữ object
Object thường được tạo và lưu ở heap memory, không nằm “bên trong” class
Máy tính sẽ chạy định nghĩa lớp đối tượng để tạo ra các thể hiện mới của loại đối tượng đó.
-> Sai
Class không tự chạy
Việc tạo object phải thông qua:
new ClassName();
Class chỉ là định nghĩa, không phải “chương trình thực thi”
Định nghĩa lớp đối tượng gọi tất cả các phương thức khác nhau trên một thể hiện đối tượng để cập nhật trạng thái của nó.
-> Sai
Method được gọi bởi object hoặc code bên ngoài
Class không “tự động gọi method”
Định nghĩa lớp là một “bản thiết kế” mô tả các thuộc tính (attributes) và hành vi (behavior) mà các object instance sẽ có.
-> Đúng
Giải thích thêm một chút về ý 3:
Hiểu đúng bản chất
- Class (định nghĩa lớp) = chỉ là bản thiết kế (blueprint). -> Class không “call method”
- Object (instance) = cái thực sự chạy và gọi method -> Object (hoặc code đang chạy) mới là thứ gọi method
Cho 1 ví dụ:
class B {
void sayHello() {
System.out.println("Hello from B");
}
}
class A {
void callB() {
B b = new B(); // tạo object B
b.sayHello(); // gọi method của B
}
}
Điều gì thực sự xảy ra?
A chỉ định nghĩa method callB()
Khi chạy:
A a = new A();
a.callB();
Object a gọi callB() -> Bên trong: tạo tạo object b, object b gọi sayHello()
Insight quan trọng:
Không phải: Class A gọi method của class B.
Mà là: Object của A gọi method của object B
Question 4:
Which method can result in the same action being token by two threads simultaneously?
Phương thức nào có thể dẫn đến việc cùng một hành động được hai thread thực hiện đồng thời?
A. scheduler.scheduleAtFixedDelay();
B. scheduler.scheduleAtFixedRate();
C. scheduler.scheduleWithFixedDelay();
D. There is no such method in ScheduledExecutorService
Câu này thì đúng là hơi khoai với ai chưa từng đụng. Kiến thức ở đây liên quan tới Java Concurrency và Executor Framework.
Câu A sai cú pháp. Giờ phân biệt B và C.
Theo đề bài thì hai thread thực hiện đồng thời được => Bị Overlap.
Chọn B là đáp án scheduler.scheduleAtFixedRate()
Vì scheduleAtFixedRate chạy theo thời gian cố định. Không quan tâm task trước đã xong chưa
C. scheduleWithFixedDelay Đợi task xong rồi mới delay
Bài cung cấp kiến thức: https://www.baeldung.com/java-executor-service-tutorial
Question 5:
You are using lists in your Java 8 application. What will be returned when the given code snippet is executed?
Bạn đang sử dụng danh sách (List) trong ứng dụng Java 8. Đoạn code được cho sẽ trả về kết quả gì khi được thực thi?
public class Demo {
public static void main(String[] args) {
Set list = new HashSet();
list.add("1");
list.add("2");
list.add("3");
list.add("1");
System.out.println(list);
}
}
A. 123 (Đáp án)
B. 1231
C. No output will be returned
D. An exception will be thrown
Question 6:
You must create a DataHolder class with only three classes: UserDataHolder, WalletDataHolder, and OrderDataHolder, to inherit. How will you achieve this in Java?
Bạn phải tạo một lớp DataHolder sao cho chỉ có đúng ba lớp được phép kế thừa từ nó: ...Bạn sẽ thực hiện điều này như thế nào trong Java?
A. By placing all classes in one file and sealing them
B. By placing all classes in one file and finalizing them
C. By placing all classes in one package, making the parent class package-private, and using the derived classes from another package.
D. By placing all classes in one package, making the parent and other classes package-private, and using the derived classes from another package.
Tôi thề câu này điên vl.
A. Bằng cách đặt tất cả các lớp trong một tệp và niêm phong (seal) chúng.
B. Bằng cách đặt tất cả các lớp trong một tệp và khai báo final cho chúng.
C. Đặt các lớp trong cùng package, để lớp cha là package-private, và dùng lớp con từ package khác.
D. Đặt tất cả class trong một package, để class cha package-private, và dùng class con từ package khác
Đi từng đáp án:
- A. Đúng. Từ khóa sealed được giới thiệu để giới hạn chính xác những lớp nào được phép kế thừa. Nếu các lớp con nằm trong cùng một file, bạn thậm chí không cần dùng từ khóa permits.
- B. Sai. Nếu bạn đặt final cho lớp cha (DataHolder), thì không một lớp nào có thể kế thừa nó được cả.
- C. Sai một phần. Cách này ngăn cản việc kế thừa từ ngoài package, nhưng bất kỳ lớp nào trong cùng package đó vẫn có thể kế thừa lớp cha. Không giới hạn được đúng 3 lớp.
- D. Sai. Tương tự đáp án C, phương pháp này dựa vào phạm vi truy cập (access modifier), nó không đủ chặt chẽ để kiểm soát số lượng lớp kế thừa chính xác là 3.
public sealed class DataHolder
permits UserDataHolder, WalletDataHolder, OrderDataHolder {
}
public final class UserDataHolder extends DataHolder {}
public final class WalletDataHolder extends DataHolder {}
public final class OrderDataHolder extends DataHolder {}
Question 7:
What will be the output of the following code snippet implemented in a Java 8 application?
Đoạn code sau sẽ in ra kết quả gì khi được thực thi trong một ứng dụng Java 8?
import java.util.HashMap;
import java.util.Map;
public class Demo {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
map.put("D", 4);
map.values().stream().peek(System.out::println).forEach(System.out::println);
}
}
A. 12341234
B. 11223344
C. 1234
D. Compilation error
Câu này liên quan tới Stream API
- peek(): là một Intermediate Operation (thao tác trung gian). Dùng để "nhìn vào" các phẩn tử trong stream khi chúng đi qua. Không làm thay đổi và thường dùng trong debug.
- forEach: lầ một Terminal Operation (thao tác kết thúc). Duyệt qua từng phần tử cuối cùng của stream.
Stream hoạt động theo cơ chế vòng đời của từng phần tử (element-by-element), chứ không phải xử lý xong hết peek rồi mới sâng forEach. Quy trình diễn ra như sau:
map.value() lấy ra 1 collection các value của Map.
- Phần tử 1 đi vào Stream:
peekin ra 1 -> forEach in ra 1 - Phần tử 2 đi vào Stream:
peekin ra 2 -> forEach in ra 2
Tương tự 3 3 4 4 => Đáp án B
Question 8:
If used at XXXX, which input will maatch the given regular expression in the following code snippet?
Nếu được sử dụng tại vị trí XXXX, thì input nào sẽ khớp (match) với biểu thức chính quy (regular expression) được cho trong đoạn code sau?
String reg = "([^\\W])[0-9]+[\\d]*[\\s]*\\1";
String input = "XXXX";
System.out.println(input.matches(reg));
A. *454--*
B. *454*
C. $*454--$
D. *454dd--*
E. None of the options
Đi làm thì chắc toàn GPT 
([^\\W]):\W(W viết hoa) đại diện cho các ký tự không phải chữ cái hay chữ số (ví dụ: *, $, #, khoảng trắng).^bên trong ngoặc vuông[]có nghĩa là phủ định.- => Chọn chữ cái hoặc chữ số.
- Dấu ngoặc đơn
()là 1 Capturing Group 1. Nhớ ký tự đầu tiên để dùng ở cuối.
[0-9]+: Có ít nhất một hoặc nhiều chữ số (từ 0 đến 9)[\\d]*:\dcũng là chữ số. Dấu*nghĩa là có 0 hoặc nhiều chữ số nữa. Phần này đi kèm phần trên tạo thành một chuỗi số[\\s]:\slà khoảng trắng. Dấu*nghĩa là có thể có hoặc không.\\1: DDaaya là điểm quan trọng nhất (Backreference). Nó yêu cầu ký tự tại vị trí này phải giống hệt ký tự đã bắt được ở Group 1
Có thể viết lại reg
String reg = "(\\w)[0-9]+\\d*\\s*\\1";
Từ phân tích ta có thể thấy cấu trúc: [Ký tự A] + [Dãy số] + [Khoảng trắng tùy ý] + [Ký tự A]
A. Sai vì ký tự đầu tiên là *
B. Sai tương tự
C. Sai $
D. Sai
E. Chọn đáp án đúng. Không có lựa chọn nào khớp
Question 9:
Analyze the Interface and class declarations given belove:
Hãy phân tích các khai báo interface và class được cho dưới đây trong Java.
public interface Car {
double getPetrol();
}
public class CarPool {
private List<Car> myCars;
public double getTotalPetrol() {
double sum = 0.0;
for (Car c : myCars) {
sum += X;
}
return sum;
}
}
Which statement can replace X so that getTotalPetrol returns the total value of petrol conssumed by all the cars in the carpool
Câu lệnh nào có thể thay thế X để phương thức getTotalPetrol trả về tổng lượng xăng đã tiêu thụ của tất cả các xe trong nhóm carpool?
A. getPetrol(c)
B. c.getPetrol()
C. Car.get(c).getPetrol()
D. myCars(c).getPetrol()
E. myCars.get(c).getPetrol()
Nhìn phát biết đáp án B rồi. Cách gọi phương thức (method invocation) thông qua một biến tham chiếu trong Java
All Rights Reserved