1. Stream API trong Java 8 được sử dụng để làm gì?
A. Quản lý luồng (thread) trong lập trình đa luồng.
B. Xử lý dữ liệu tuần tự từ file.
C. Xử lý collections dữ liệu theo kiểu functional, cho phép thực hiện các phép toán như filter, map, reduce một cách hiệu quả.
D. Tạo giao diện người dùng đồ họa (GUI).
2. Trong Java, 'boxing' và 'unboxing' là gì?
A. Boxing là chuyển đổi kiểu dữ liệu nguyên thủy thành đối tượng wrapper class, unboxing ngược lại.
B. Boxing là đóng gói nhiều đối tượng vào một đối tượng duy nhất, unboxing là giải nén chúng.
C. Boxing là tạo ra một biến final, unboxing là thay đổi giá trị của biến final.
D. Boxing là khai báo một biến static, unboxing là hủy biến static.
3. Phương thức `clone()` trong Java được sử dụng để tạo bản sao của đối tượng. Để một lớp có thể sử dụng `clone()`, nó cần phải làm gì?
A. Kế thừa từ lớp `Cloneable`.
B. Implement interface `Cloneable` và ghi đè phương thức `clone()` từ lớp `Object`.
C. Khai báo phương thức `clone()` là static.
D. Không cần điều kiện gì đặc biệt, mọi lớp đều có thể sử dụng `clone()` mặc định.
4. Garbage Collection trong Java hoạt động dựa trên cơ chế nào là chủ yếu?
A. Đếm tham chiếu (Reference Counting).
B. Đánh dấu và quét (Mark and Sweep).
C. Giải thuật FIFO (First-In, First-Out).
D. Giải thuật LIFO (Last-In, First-Out).
5. Mục đích chính của từ khóa `static` trong Java là gì?
A. Tạo ra các biến và phương thức chỉ có thể truy cập từ bên trong lớp.
B. Tạo ra các biến và phương thức thuộc về lớp chứ không phải đối tượng cụ thể của lớp.
C. Ngăn chặn việc ghi đè phương thức trong lớp con.
D. Đảm bảo tính an toàn luồng cho các biến và phương thức.
6. Exception (ngoại lệ) 'Checked' và 'Unchecked' khác nhau cơ bản ở điểm nào trong Java?
A. Checked exceptions xảy ra tại thời điểm biên dịch, Unchecked exceptions xảy ra tại thời điểm chạy.
B. Unchecked exceptions phải được xử lý bằng try-catch hoặc throws, Checked exceptions thì không cần.
C. Checked exceptions là lỗi lập trình, Unchecked exceptions là lỗi hệ thống.
D. Checked exceptions kế thừa từ `RuntimeException`, Unchecked exceptions kế thừa từ `Exception`.
7. Trong Java, Garbage Collection (GC) là gì và nó hoạt động như thế nào?
A. GC là một cơ chế quản lý bộ nhớ tự động, giải phóng bộ nhớ không còn được sử dụng bởi chương trình.
B. GC là một kỹ thuật tối ưu hóa hiệu suất, tăng tốc độ thực thi chương trình Java.
C. GC là một trình biên dịch mã nguồn Java thành mã máy.
D. GC là một thư viện chuẩn của Java để quản lý file và thư mục.
8. Lambda expression trong Java 8 là gì và lợi ích chính của nó là gì?
A. Một cách khai báo biến hằng số ngắn gọn hơn.
B. Một cách biểu diễn anonymous function (hàm vô danh) ngắn gọn, giúp code ngắn gọn và dễ đọc hơn khi làm việc với functional interface.
C. Một cơ chế quản lý bộ nhớ mới trong Java 8.
D. Một loại vòng lặp mới trong Java 8.
9. Dependency Injection (DI) là gì và lợi ích chính của nó trong Java?
A. Một kỹ thuật tối ưu hóa hiệu suất ứng dụng.
B. Một pattern thiết kế giúp giảm sự phụ thuộc giữa các component, tăng tính module hóa, dễ bảo trì và kiểm thử.
C. Một cơ chế quản lý bộ nhớ tự động.
D. Một phương pháp mã hóa dữ liệu để bảo mật.
10. Trong lập trình hướng đối tượng Java, 'tính đa hình' (polymorphism) đề cập đến điều gì?
A. Khả năng một đối tượng thuộc nhiều lớp khác nhau.
B. Khả năng một phương thức có thể được định nghĩa lại trong các lớp con (ghi đè phương thức - method overriding).
C. Khả năng một lớp có thể kế thừa từ nhiều lớp cha.
D. Khả năng che giấu thông tin chi tiết triển khai và chỉ hiển thị giao diện.
11. Reflection trong Java là gì và khi nào nên sử dụng?
A. Một kỹ thuật tối ưu hóa hiệu suất code Java.
B. Một API cho phép chương trình Java kiểm tra và thao tác với các class, interface, methods, fields tại runtime.
C. Một cơ chế bảo mật để che giấu code Java.
D. Một công cụ debug code Java nâng cao.
12. Nguyên tắc 'composition over inheritance' (kết hợp hơn kế thừa) trong OOP là gì và tại sao nó được ưu tiên?
A. Nên sử dụng kế thừa thay vì kết hợp để tái sử dụng code.
B. Nên ưu tiên kết hợp (composition) để tái sử dụng code và xây dựng mối quan hệ 'has-a' thay vì kế thừa (inheritance) để xây dựng mối quan hệ 'is-a', giúp giảm coupling và tăng tính linh hoạt.
C. Không có sự khác biệt giữa kết hợp và kế thừa.
D. Kết hợp chỉ nên sử dụng cho các lớp trừu tượng, kế thừa cho các lớp cụ thể.
13. Phương thức `finalize()` trong Java được sử dụng để làm gì và tại sao nó thường được khuyến cáo không nên sử dụng?
A. `finalize()` được gọi ngay trước khi một đối tượng được garbage collected để thực hiện cleanup resources.
B. `finalize()` được sử dụng để khởi tạo giá trị ban đầu cho các biến instance.
C. `finalize()` được gọi khi chương trình kết thúc để giải phóng tất cả tài nguyên.
D. `finalize()` được sử dụng để xử lý ngoại lệ.
14. Đoạn code sau in ra kết quả gì? `System.out.println(5 + 2 + '3' + 4 + 5);`
A. 19
B. 7345
C. 739
D. 52345
15. Đoạn code sau in ra kết quả gì? `int[] arr = {1, 2, 3}; try { System.out.println(arr[3]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println('Index out of bounds'); } finally { System.out.println('Finally block'); }`
A. 3
Finally block
B. Index out of bounds
C. Index out of bounds
Finally block
D. Compiler error
16. Luồng (Thread) trong Java là gì và tại sao chúng được sử dụng?
A. Thread là một chương trình con độc lập, chạy song song với chương trình chính để tăng hiệu suất.
B. Thread là một đơn vị thực thi nhỏ nhất trong một tiến trình (process), cho phép thực hiện đa nhiệm đồng thời.
C. Thread là một loại biến đặc biệt để lưu trữ dữ liệu đa luồng.
D. Thread là một cơ chế bảo mật để ngăn chặn truy cập trái phép vào dữ liệu.
17. Đâu là sự khác biệt chính giữa `ArrayList` và `LinkedList` trong Java?
A. `ArrayList` cho phép truy cập phần tử ngẫu nhiên nhanh hơn, `LinkedList` cho phép thêm/xóa phần tử ở đầu/cuối nhanh hơn.
B. `LinkedList` sử dụng mảng động, `ArrayList` sử dụng danh sách liên kết.
C. `ArrayList` an toàn luồng (thread-safe), `LinkedList` thì không.
D. `LinkedList` có thể chứa các phần tử null, `ArrayList` thì không.
18. 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. `equals()` so sánh tham chiếu đối tượng, `==` so sánh giá trị thuộc tính đối tượng.
B. `==` so sánh tham chiếu đối tượng, `equals()` so sánh giá trị nội dung đối tượng (nếu được ghi đè).
C. Không có sự khác biệt, cả hai đều so sánh giá trị nội dung đối tượng.
D. Không có sự khác biệt, cả hai đều so sánh tham chiếu đối tượng.
19. Trong Java, từ khóa nào được sử dụng để khai báo một biến hằng số (constant)?
A. static
B. final
C. const
D. immutable
20. Mục đích của từ khóa `synchronized` trong Java là gì?
A. Đảm bảo rằng một phương thức hoặc khối code chỉ được thực thi bởi một thread tại một thời điểm, tránh race condition.
B. Tối ưu hóa hiệu suất của chương trình đa luồng.
C. Khai báo một biến static.
D. Bắt buộc xử lý ngoại lệ Checked Exception.
21. Đoạn code sau in ra kết quả gì? `String str1 = new String('Java'); String str2 = 'Java'; System.out.println(str1 == str2);`
A. true
B. false
C. Compiler error
D. Runtime exception
22. Annotation (chú thích) trong Java được sử dụng để làm gì?
A. Thay thế cho comment, giúp code dễ đọc hơn.
B. Cung cấp metadata (dữ liệu về dữ liệu) cho trình biên dịch hoặc JVM, có thể ảnh hưởng đến quá trình biên dịch hoặc runtime.
C. Tăng tốc độ biên dịch chương trình Java.
D. Tự động sinh code Java.
23. JDBC (Java Database Connectivity) là gì và mục đích sử dụng?
A. Một thư viện để phát triển giao diện người dùng web bằng Java.
B. Một API cho phép các ứng dụng Java tương tác với cơ sở dữ liệu quan hệ (RDBMS).
C. Một framework để xây dựng ứng dụng web Java.
D. Một công cụ để quản lý bộ nhớ trong Java.
24. Giao diện (interface) trong Java khác với lớp trừu tượng (abstract class) như thế nào?
A. Lớp trừu tượng có thể chứa các phương thức có thân, giao diện thì không.
B. Giao diện có thể chứa các biến instance, lớp trừu tượng thì không.
C. Một lớp có thể kế thừa từ nhiều lớp trừu tượng, nhưng chỉ có thể implement một giao diện.
D. Lớp trừu tượng không thể được khởi tạo trực tiếp, giao diện thì có thể.
25. Phân biệt giữa `throw` và `throws` trong xử lý ngoại lệ Java.
A. `throw` dùng để khai báo ngoại lệ có thể xảy ra, `throws` dùng để ném ra một ngoại lệ.
B. `throws` dùng để khai báo ngoại lệ có thể xảy ra trong một phương thức, `throw` dùng để ném ra một ngoại lệ một cách tường minh.
C. Không có sự khác biệt, chúng có thể thay thế cho nhau.
D. `throw` dùng cho Checked Exception, `throws` dùng cho Unchecked Exception.
26. Nguyên tắc 'SOLID' trong lập trình hướng đối tượng là gì và chúng đại diện cho điều gì?
A. Một tập hợp các quy tắc đặt tên biến và phương thức.
B. Năm nguyên tắc thiết kế hướng đối tượng giúp tạo ra phần mềm dễ bảo trì, mở rộng và linh hoạt.
C. Các tiêu chuẩn về hiệu suất và tốc độ của ứng dụng Java.
D. Các quy tắc về bảo mật và an toàn dữ liệu trong Java.
27. Phương thức `super()` trong Java được sử dụng để làm gì?
A. Gọi một phương thức static của lớp cha.
B. Gọi constructor của lớp cha từ constructor của lớp con.
C. Truy cập các biến private của lớp cha.
D. Tạo một đối tượng mới của lớp cha.
28. JVM (Java Virtual Machine) là gì và vai trò chính của nó trong nền tảng Java là gì?
A. JVM là trình biên dịch mã nguồn Java thành mã máy.
B. JVM là một môi trường runtime, biên dịch bytecode Java thành mã máy và thực thi mã, cung cấp tính độc lập nền tảng cho Java.
C. JVM là một thư viện chuẩn của Java để phát triển giao diện người dùng.
D. JVM là một công cụ debug code Java.
29. Phương thức `hashCode()` và `equals()` có mối quan hệ như thế nào trong Java?
A. Không có mối quan hệ nào, chúng hoạt động độc lập.
B. Nếu hai đối tượng bằng nhau theo `equals()`, thì `hashCode()` của chúng phải trả về cùng một giá trị.
C. Nếu hai đối tượng có cùng `hashCode()`, thì chúng phải bằng nhau theo `equals()`.
D. `hashCode()` được sử dụng để so sánh đối tượng, `equals()` để tạo hash code.
30. Serialization trong Java là gì và khi nào nó được sử dụng?
A. Serialization là quá trình chuyển đổi đối tượng thành một chuỗi byte để lưu trữ hoặc truyền qua mạng.
B. Serialization là quá trình mã hóa dữ liệu để bảo mật thông tin.
C. Serialization là quá trình kiểm tra và sửa lỗi trong mã nguồn Java.
D. Serialization là quá trình tối ưu hóa hiệu suất của ứng dụng Java.