Bài Tập, Đề Thi Trắc Nghiệm Online - Môn Java bao gồm nhiều câu hỏi hay, bám sát chương trình. Cùng làm bài tập trắc nghiệm ngay.
Câu 1: Trong lập trình hướng đối tượng Java, khái niệm nào sau đây thể hiện sự đóng gói dữ liệu và phương thức hoạt động trên dữ liệu đó vào trong một đơn vị duy nhất?
- A. Tính đa hình (Polymorphism)
- B. Tính kế thừa (Inheritance)
- C. Tính trừu tượng (Abstraction)
- D. Tính đóng gói (Encapsulation)
Câu 2: Phương thức `equals()` và toán tử `==` khác nhau như thế nào khi so sánh các đối tượng trong Java?
- A. Không có sự khác biệt, cả hai đều so sánh giá trị của đối tượng.
- B. Không có sự khác biệt, cả hai đều so sánh tham chiếu của đối tượng.
- C. `==` so sánh tham chiếu, `equals()` so sánh giá trị (nội dung) của đối tượng.
- D. `equals()` so sánh tham chiếu, `==` so sánh giá trị (nội dung) của đối tượng.
Câu 3: Xem xét đoạn mã sau:
```java
String str1 = new String(
- A. `str1 == str2`
- B. `str2 == str3`
- C. `str1.equals(str2)` trả về `false`
- D. `str1 == str3`
Câu 4: Trong Java, interface và abstract class khác nhau chủ yếu ở điểm nào?
- A. Một class có thể implement nhiều interface nhưng chỉ có thể kế thừa từ một abstract class.
- B. Abstract class không thể chứa các phương thức abstract, trong khi interface chỉ chứa phương thức abstract.
- C. Interface có thể có constructor, abstract class thì không.
- D. Không có sự khác biệt đáng kể giữa interface và abstract class trong Java.
Câu 5: Cho đoạn code sau:
```java
public class Example {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
try {
System.out.println(numbers[5]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(
- A. 5
Khối finally luôn được thực thi
- B. Lỗi: Truy cập ngoài phạm vi mảng
Khối finally luôn được thực thi
- C. Lỗi: Truy cập ngoài phạm vi mảng
- D. Chương trình sẽ không biên dịch được
Câu 6: Giải thích ý nghĩa của từ khóa `static` trong Java và cho biết khi nào nên sử dụng `static` cho biến và phương thức.
- A. `static` làm cho biến hoặc phương thức trở thành private, chỉ truy cập được trong class.
- B. `static` chỉ được dùng cho phương thức, không dùng cho biến.
- C. `static` tạo ra biến/phương thức thuộc về class, không phải instance; dùng khi muốn chia sẻ dữ liệu/logic chung cho tất cả đối tượng.
- D. `static` giúp tăng tốc độ truy cập biến và phương thức.
Câu 7: Trong Java Collections Framework, lớp `ArrayList` và `LinkedList` khác nhau chủ yếu về cấu trúc dữ liệu và hiệu suất thao tác nào?
- A. `ArrayList` nhanh hơn trong việc thêm/xóa phần tử ở đầu danh sách, `LinkedList` nhanh hơn khi truy cập ngẫu nhiên.
- B. Không có sự khác biệt về hiệu suất giữa `ArrayList` và `LinkedList`.
- C. Cả hai đều có hiệu suất tương đương trong mọi thao tác.
- D. `ArrayList` sử dụng mảng động, truy cập ngẫu nhiên nhanh, thêm/xóa ở giữa/đầu chậm; `LinkedList` dùng danh sách liên kết, thêm/xóa nhanh, truy cập ngẫu nhiên chậm.
Câu 8: Phương thức `hashCode()` và `equals()` có mối quan hệ như thế nào trong Java và tại sao cần override cả hai khi làm việc với Collections như `HashSet` hoặc `HashMap`?
- A. Nếu `equals()` trả về `true` cho hai đối tượng, `hashCode()` của chúng phải trả về cùng một giá trị; cần override để đảm bảo tính đúng đắn khi dùng trong `HashSet`, `HashMap`.
- B. Không cần override cả hai, chỉ cần override `equals()` là đủ.
- C. `hashCode()` và `equals()` không liên quan đến nhau.
- D. Chỉ cần override `hashCode()` khi dùng `HashSet` hoặc `HashMap`.
Câu 9: Giải thích khái niệm về Generics trong Java và lợi ích chính mà Generics mang lại cho việc phát triển phần mềm.
- A. Generics là một cách để tạo ra các class và interface mà không cần kiểu dữ liệu cụ thể, giúp code chạy nhanh hơn.
- B. Generics cho phép tham số hóa kiểu dữ liệu, tăng cường type safety (kiểm tra kiểu tại compile-time), giảm lỗi runtime và tái sử dụng code.
- C. Generics chỉ dùng để làm cho code trở nên phức tạp hơn và khó đọc hơn.
- D. Generics không có lợi ích gì đáng kể trong Java.
Câu 10: Cho đoạn code sau:
```java
List numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.reduce(0, Integer::sum);
System.out.println(sum);
```
Đoạn code trên tính toán giá trị gì và kết quả in ra là bao nhiêu?
- A. Tổng các số lẻ trong danh sách, kết quả là 9.
- B. Tổng bình phương các số lẻ trong danh sách, kết quả là 35.
- C. Tổng bình phương các số chẵn trong danh sách, kết quả là 20 (22 + 44).
- D. Tổng tất cả các số trong danh sách, kết quả là 15.
Câu 11: Trong Java, thread và process khác nhau như thế nào và khi nào thì nên sử dụng threads thay vì processes?
- A. Thread và process là giống nhau, chỉ khác tên gọi.
- B. Process là chương trình độc lập, thread là luồng thực thi trong process; threads chia sẻ bộ nhớ, processes thì không; threads hiệu quả hơn cho tác vụ I/O-bound và chia sẻ dữ liệu.
- C. Processes nhanh hơn threads trong việc chuyển đổi ngữ cảnh.
- D. Threads an toàn hơn processes vì chúng không chia sẻ bộ nhớ.
Câu 12: Giải thích khái niệm về Serialization trong Java và tại sao nó lại quan trọng trong việc lưu trữ và truyền tải đối tượng.
- A. Serialization là quá trình mã hóa dữ liệu để bảo mật thông tin.
- B. Serialization là cách để tạo ra bản sao của một đối tượng.
- C. Serialization là quá trình chuyển đổi đối tượng thành chuỗi byte để lưu trữ hoặc truyền qua mạng, sau đó có thể deserialize để tái tạo đối tượng; quan trọng cho persistence và RMI.
- D. Serialization chỉ dùng để hiển thị đối tượng dưới dạng text.
Câu 13: Cho đoạn code sau:
```java
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
Counter counter = new Counter();
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.println(counter.getCount());
}
}
```
Giá trị in ra của `counter.getCount()` có khả năng cao nhất là bao nhiêu và tại sao từ khóa `synchronized` lại được sử dụng trong phương thức `increment()`?
- A. Khoảng 1000, vì có race condition.
- B. Luôn luôn 2000, vì mỗi thread increment 1000 lần.
- C. Khoảng 1500, do sự can thiệp giữa các threads.
- D. Gần như chắc chắn là 2000, `synchronized` đảm bảo tính nguyên tử của phép increment, tránh race condition.
Câu 14: Giải thích Dependency Injection (DI) là gì và lợi ích của việc sử dụng DI trong phát triển ứng dụng Java, đặc biệt trong các framework như Spring.
- A. DI là một kỹ thuật để tăng tốc độ thực thi của ứng dụng Java.
- B. DI là một cách để tạo ra các class singleton trong Java.
- C. DI là pattern cho phép inject dependencies (sự phụ thuộc) vào class thay vì class tự tạo dependencies, giúp giảm coupling, tăng tính testable, maintainable và tái sử dụng.
- D. DI chỉ được sử dụng trong lập trình web, không liên quan đến ứng dụng desktop.
Câu 15: Trong Java, Annotations là gì và chúng được sử dụng để làm gì? Cho ví dụ về một Annotation phổ biến và công dụng của nó.
- A. Annotations là một loại comment đặc biệt trong Java.
- B. Annotations là metadata cung cấp thông tin về code cho compiler, runtime environment hoặc các công cụ khác; ví dụ `@Override` báo cho compiler biết phương thức đang override phương thức của lớp cha.
- C. Annotations chỉ được dùng để tạo tài liệu tự động cho code.
- D. Annotations không có tác dụng gì trong Java.
Câu 16: Cho đoạn code sau:
```java
Optional name = Optional.ofNullable(null);
String result = name.orElse(
- A. NullPointerException
- B. null
- C.
- D. Optional.empty
Câu 17: Giải thích sự khác biệt giữa checked exceptions và unchecked exceptions trong Java và cho ví dụ về mỗi loại.
- A. Checked exceptions luôn xảy ra do lỗi lập trình, unchecked exceptions do lỗi hệ thống.
- B. Unchecked exceptions phải được xử lý bằng try-catch, checked exceptions thì không cần.
- C. Không có sự khác biệt giữa checked và unchecked exceptions.
- D. Checked exceptions (ví dụ `IOException`) phải được xử lý hoặc khai báo throws, unchecked exceptions (ví dụ `NullPointerException`) không bắt buộc; checked thường do lỗi bên ngoài (I/O), unchecked thường do lỗi lập trình.
Câu 18: Trong Java, Reflection là gì và nó được sử dụng để làm gì? Nêu một ví dụ về ứng dụng của Reflection.
- A. Reflection là một kỹ thuật để tối ưu hóa hiệu suất code Java.
- B. Reflection là API cho phép kiểm tra và thao tác class, interface, constructor, method, field tại runtime; dùng trong IDE, framework (Spring), serialization.
- C. Reflection chỉ được dùng để debug code.
- D. Reflection làm giảm tính bảo mật của ứng dụng Java.
Câu 19: Cho đoạn code sau:
```java
import java.util.function.Function;
public class FunctionExample {
public static void main(String[] args) {
Function stringLength = String::length;
int length = stringLength.apply(
- A.
- B. 0
- C. 5
- D. Lỗi biên dịch
Câu 20: Giải thích nguyên tắc SOLID trong lập trình hướng đối tượng và cho biết mỗi chữ cái trong SOLID đại diện cho nguyên tắc nào. Tại sao các nguyên tắc SOLID quan trọng trong thiết kế phần mềm?
- A. SOLID là 5 nguyên tắc thiết kế hướng đối tượng: Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion; giúp code maintainable, extensible, testable, giảm coupling.
- B. SOLID là các pattern thiết kế để giải quyết các vấn đề concurrency trong Java.
- C. SOLID chỉ áp dụng cho ngôn ngữ C++, không liên quan đến Java.
- D. SOLID là các nguyên tắc để tối ưu hóa hiệu suất ứng dụng Java.
Câu 21: Trong Java, Garbage Collection (GC) là gì và nó hoạt động như thế nào? Tại sao GC lại quan trọng trong việc quản lý bộ nhớ?
- A. GC là một kỹ thuật để nén dữ liệu trong bộ nhớ.
- B. GC là cơ chế tự động thu hồi bộ nhớ không còn được tham chiếu đến (đối tượng không dùng nữa); quan trọng để tránh memory leaks và quản lý bộ nhớ hiệu quả.
- C. GC chỉ hoạt động khi bộ nhớ đầy, gây giảm hiệu suất.
- D. Java không có Garbage Collection, lập trình viên phải tự quản lý bộ nhớ.
Câu 22: Cho đoạn code sau:
```java
public class StringImmutable {
public static void main(String[] args) {
String s =
- A.
- B. null
- C.
- D. Lỗi runtime
Câu 23: Giải thích sự khác biệt giữa method overloading và method overriding trong Java, cho ví dụ minh họa cho mỗi khái niệm.
- A. Overloading và overriding là giống nhau, chỉ là hai tên gọi khác nhau.
- B. Overriding xảy ra trong cùng một class, overloading xảy ra giữa class cha và class con.
- C. Overloading là ghi đè phương thức của class cha, overriding là tạo phương thức trùng tên trong cùng class.
- D. Overloading: nhiều phương thức cùng tên khác tham số trong cùng class; Overriding: class con định nghĩa lại phương thức của class cha có cùng tên và tham số.
Câu 24: Trong Java, Access Modifiers (public, private, protected, default) dùng để làm gì và chúng khác nhau như thế nào về phạm vi truy cập?
- A. Access Modifiers dùng để đặt tên biến và phương thức.
- B. Access Modifiers kiểm soát phạm vi truy cập (visibility) của class members; `public` (mọi nơi), `protected` (cùng package, subclass), `default` (cùng package), `private` (trong class).
- C. Access Modifiers chỉ ảnh hưởng đến hiệu suất của code.
- D. Không có sự khác biệt về phạm vi truy cập giữa các Access Modifiers.
Câu 25: Giải thích khái niệm về Design Patterns trong lập trình hướng đối tượng và tại sao chúng quan trọng trong phát triển phần mềm. Nêu ví dụ về một Design Pattern phổ biến (ví dụ: Singleton, Factory, Observer).
- A. Design Patterns là các thuật toán sắp xếp dữ liệu hiệu quả.
- B. Design Patterns chỉ áp dụng cho lập trình web.
- C. Design Patterns là giải pháp thiết kế tái sử dụng cho vấn đề thường gặp; Singleton (đảm bảo duy nhất một instance), Factory (tạo đối tượng mà không cần biết class cụ thể), Observer (quan sát và thông báo thay đổi). Quan trọng vì tăng tái sử dụng, maintainability, giao tiếp chung.
- D. Design Patterns làm cho code trở nên phức tạp và khó hiểu hơn.
Câu 26: Cho đoạn code sau:
```java
public class StringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder(
- A.
- B.
- C. null
- D. Lỗi runtime
Câu 27: Giải thích khái niệm về Java Virtual Machine (JVM) và vai trò của nó trong tính
- A. JVM là trình biên dịch Java sang mã máy.
- B. JVM là máy ảo thực thi bytecode Java (.class files); bytecode chạy trên mọi JVM, giúp
- C. JVM chỉ chạy trên hệ điều hành Windows.
- D. JVM không liên quan đến tính
Câu 28: Trong lập trình Java, Logging là gì và tại sao nó quan trọng trong việc phát triển và vận hành ứng dụng? Nêu ví dụ về một framework Logging phổ biến trong Java (ví dụ: Log4j, SLF4j).
- A. Logging là một kỹ thuật để tối ưu hóa hiệu suất ứng dụng.
- B. Logging chỉ cần thiết trong giai đoạn debug, không quan trọng khi ứng dụng chạy production.
- C. Logging là ghi lại thông tin về hoạt động ứng dụng (logs) để theo dõi, debug, giám sát; quan trọng cho phát triển, test, production; Log4j, SLF4j là framework phổ biến.
- D. Java không hỗ trợ Logging, lập trình viên phải tự implement.
Câu 29: Giải thích khái niệm về Java Collections Framework và các loại Collections chính trong framework này (ví dụ: Lists, Sets, Maps). Cho biết khi nào nên sử dụng loại Collection nào.
- A. Java Collections Framework chỉ chứa các class để làm việc với file.
- B. Java Collections Framework chỉ có một loại Collection duy nhất là Array.
- C. Java Collections Framework không quan trọng trong lập trình Java.
- D. Java Collections Framework là tập hợp interface/class để lưu trữ/thao tác dữ liệu; Lists (danh sách có thứ tự, trùng lặp), Sets (tập hợp không thứ tự, không trùng lặp), Maps (key-value pairs); chọn loại tùy yêu cầu (thứ tự, trùng lặp, tìm kiếm nhanh).
Câu 30: Trong Java, Functional Programming là gì và nó được thể hiện qua những tính năng nào trong Java 8 trở lên (ví dụ: Lambda Expressions, Streams API)? Lợi ích của Functional Programming trong Java là gì?
- A. Functional Programming là paradigm lập trình coi hàm số là first-class citizens, tránh side-effects và mutable state; Java 8+ hỗ trợ qua Lambda, Streams; lợi ích: code ngắn gọn, dễ đọc, dễ test, concurrency tốt hơn.
- B. Functional Programming làm cho code Java chạy chậm hơn.
- C. Java không hỗ trợ Functional Programming.
- D. Functional Programming chỉ áp dụng cho các bài toán khoa học, không liên quan đến ứng dụng doanh nghiệp.