1. Trong Java, từ khóa nào được sử dụng để khai báo một biến hằng số?
A. static
B. final
C. const
D. immutable
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. `equals()` so sánh tham chiếu đối tượng, `==` so sánh giá trị thuộc tính.
B. `equals()` so sánh giá trị thuộc tính, `==` so sánh tham chiếu đối tượng.
C. Cả hai đều so sánh tham chiếu đối tượng.
D. Cả hai đều so sánh giá trị thuộc tính.
3. Khái niệm nào sau đây thể hiện tính đóng gói (encapsulation) trong lập trình hướng đối tượng Java?
A. Khả năng một đối tượng thuộc nhiều lớp.
B. Che giấu thông tin và hành vi bên trong đối tượng, chỉ cho phép truy cập thông qua các phương thức công khai.
C. Khả năng tạo ra các lớp con từ lớp cha.
D. Tự động chuyển đổi kiểu dữ liệu.
4. Trong Java, interface và abstract class khác nhau cơ bản ở điểm nào?
A. Interface có thể chứa các phương thức concrete, abstract class thì không.
B. Một lớp có thể implements nhiều interface nhưng chỉ có thể extends một abstract class.
C. Abstract class không thể có constructor, interface thì có.
D. Interface được sử dụng để tạo đối tượng, abstract class thì không.
5. Kiểu dữ liệu nguyên thủy nào trong Java được sử dụng để lưu trữ giá trị logic (đúng/sai)?
A. int
B. char
C. boolean
D. string
6. Vòng lặp `for-each` (enhanced for loop) trong Java thường được sử dụng để làm gì?
A. Lặp qua các phần tử của một mảng hoặc collection.
B. Lặp vô hạn cho đến khi có điều kiện dừng.
C. Lặp với bước nhảy tùy chỉnh.
D. Lặp qua các số nguyên từ 0 đến n.
7. Ngoại lệ (Exception) trong Java là gì?
A. Một lỗi cú pháp trong mã nguồn.
B. Một sự kiện bất thường xảy ra trong quá trình thực thi chương trình, làm gián đoạn luồng thực thi bình thường.
C. Một cảnh báo từ trình biên dịch.
D. Một loại dữ liệu đặc biệt.
8. Từ khóa `static` trong Java có ý nghĩa gì khi được sử dụng cho một biến thành viên của lớp?
A. Biến chỉ có thể truy cập từ bên trong lớp.
B. Biến được tạo ra bản sao riêng cho mỗi đối tượng của lớp.
C. Biến được chia sẻ chung bởi tất cả các đối tượng của lớp.
D. Biến không thể thay đổi giá trị sau khi khởi tạo.
9. Phương thức `main()` trong Java có vai trò gì?
A. Phương thức khởi tạo đối tượng.
B. Điểm bắt đầu thực thi của chương trình Java.
C. Phương thức hủy đối tượng khi không còn sử dụng.
D. Phương thức định nghĩa giao diện người dùng.
10. Trong lập trình hướng đối tượng, `tính đa hình` (polymorphism) đề cập đến điều gì?
A. Khả năng một lớp có nhiều thuộc tính.
B. Khả năng một đối tượng có nhiều trạng thái.
C. Khả năng một đối tượng thuộc nhiều lớp.
D. Khả năng một đối tượng hoặc phương thức có thể có nhiều hình thức hoặc biểu hiện khác nhau.
11. Để tạo một luồng (thread) mới trong Java, bạn thường sử dụng cách nào sau đây?
A. Kế thừa lớp `Runnable` hoặc `Thread`.
B. Sử dụng từ khóa `synchronized`.
C. Gọi phương thức `sleep()`.
D. Sử dụng garbage collector.
12. Mục đích chính của garbage collection (thu gom rác) trong Java là gì?
A. Tối ưu hóa hiệu suất CPU.
B. Giải phóng bộ nhớ không còn được sử dụng bởi chương trình.
C. Ngăn chặn lỗi tràn bộ nhớ stack.
D. Kiểm soát quyền truy cập bộ nhớ.
13. Trong Java, `ArrayList` và `LinkedList` khác nhau chủ yếu ở cấu trúc dữ liệu bên trong. Điều này ảnh hưởng đến hiệu suất của chúng như thế nào?
A. `ArrayList` nhanh hơn trong việc thêm/xóa phần tử ở đầu, `LinkedList` nhanh hơn trong việc truy cập phần tử ngẫu nhiên.
B. `ArrayList` nhanh hơn trong việc truy cập phần tử ngẫu nhiên, `LinkedList` nhanh hơn trong việc thêm/xóa phần tử ở đầu và giữa.
C. Cả hai đều có hiệu suất tương đương trong mọi thao tác.
D. `LinkedList` luôn nhanh hơn `ArrayList` trong mọi trường hợp.
14. Annotation (chú thích) trong Java được sử dụng để làm gì?
A. Thay thế cho comment (chú thích thông thường).
B. Cung cấp siêu dữ liệu (metadata) về mã nguồn, có thể được sử dụng bởi trình biên dịch, JVM hoặc các công cụ khác.
C. Định nghĩa kiểu dữ liệu mới.
D. Tăng tốc độ biên dịch mã nguồn.
15. Serialization trong Java là quá trình gì?
A. Chuyển đổi mã nguồn Java thành bytecode.
B. Chuyển đổi một đối tượng Java thành một chuỗi byte để lưu trữ hoặc truyền tải qua mạng.
C. Biên dịch mã nguồn Java.
D. Kiểm tra lỗi cú pháp trong mã nguồn.
16. Trong Java, từ khóa `super` được sử dụng để làm gì?
A. Tham chiếu đến đối tượng hiện tại.
B. Gọi constructor của lớp con.
C. Gọi phương thức hoặc constructor của lớp cha (superclass).
D. Khai báo một lớp cha.
17. JDBC (Java Database Connectivity) là gì?
A. Một framework để xây dựng giao diện người dùng đồ họa (GUI) trong Java.
B. Một API cho phép các chương trình Java tương tác với cơ sở dữ liệu.
C. Một thư viện để xử lý XML trong Java.
D. Một công cụ để biên dịch mã Java.
18. Lambda expression (biểu thức lambda) trong Java 8 được giới thiệu để làm gì?
A. Thay thế cho vòng lặp for.
B. Cung cấp một cách ngắn gọn để biểu diễn các functional interface (interface hàm).
C. Tăng tốc độ biên dịch mã Java.
D. Quản lý bộ nhớ hiệu quả hơn.
19. Stream API trong Java 8 cung cấp cơ chế xử lý dữ liệu kiểu nào?
A. Xử lý dữ liệu tuần tự theo kiểu hướng đối tượng.
B. Xử lý dữ liệu theo kiểu khai báo (declarative) và song song (parallel) trên các collections.
C. Xử lý dữ liệu đồ họa.
D. Xử lý dữ liệu nhập xuất từ bàn phím.
20. Trong Java, cơ chế xử lý ngoại lệ `try-catch-finally` được sử dụng để làm gì?
A. Định nghĩa các lớp ngoại lệ mới.
B. Bắt và xử lý các ngoại lệ có thể xảy ra trong khối `try`, và đảm bảo khối `finally` luôn được thực thi (dù có hay không ngoại lệ).
C. Tối ưu hóa hiệu suất chương trình.
D. Kiểm tra tính đúng đắn của mã nguồn.
21. Giả sử bạn có một lớp `Dog` kế thừa từ lớp `Animal`. Nếu bạn tạo một đối tượng `Dog` và gán nó cho một biến kiểu `Animal`, bạn có thể gọi phương thức nào của đối tượng đó?
A. Chỉ các phương thức được định nghĩa trong lớp `Dog`.
B. Chỉ các phương thức được định nghĩa trong lớp `Animal`.
C. Các phương thức được định nghĩa trong cả `Animal` và `Dog`, nhưng ưu tiên phương thức của `Dog` nếu bị ghi đè.
D. Không thể gọi bất kỳ phương thức nào vì kiểu biến và kiểu đối tượng khác nhau.
22. Trong Java, `constructor` là gì?
A. Một phương thức đặc biệt được gọi tự động khi một đối tượng của lớp được tạo ra, dùng để khởi tạo đối tượng.
B. Một từ khóa để khai báo biến hằng số.
C. Một loại interface.
D. Một annotation.
23. Giả sử bạn cần lưu trữ một tập hợp các phần tử duy nhất và không quan tâm đến thứ tự. Collection framework nào của Java phù hợp nhất?
A. List
B. Set
C. Map
D. Queue
24. Mục đích của từ khóa `synchronized` trong Java là gì?
A. Tạo ra một luồng mới.
B. Đồng bộ hóa việc truy cập vào một khối mã hoặc phương thức giữa các luồng, tránh race condition.
C. Xử lý ngoại lệ.
D. Khai báo biến static.
25. Trong mô hình MVC (Model-View-Controller), thành phần `Controller` có vai trò gì?
A. Hiển thị dữ liệu cho người dùng.
B. Lưu trữ và quản lý dữ liệu.
C. Xử lý logic nghiệp vụ và điều phối tương tác giữa Model và View.
D. Định nghĩa giao diện người dùng.
26. Giả sử bạn có một mảng số nguyên đã được sắp xếp. Thuật toán tìm kiếm nào hiệu quả nhất để tìm kiếm một giá trị cụ thể trong mảng đó?
A. Tìm kiếm tuyến tính (Linear Search).
B. Tìm kiếm nhị phân (Binary Search).
C. Tìm kiếm theo chiều rộng (Breadth-First Search).
D. Tìm kiếm theo chiều sâu (Depth-First Search).
27. Trong Java Web application, Servlet container (ví dụ: Tomcat) có vai trò gì?
A. Biên dịch mã Java.
B. Quản lý vòng đời của Servlet, xử lý request và response từ client.
C. Quản lý cơ sở dữ liệu.
D. Cung cấp giao diện người dùng đồ họa.
28. Dependency Injection (DI) là một nguyên tắc thiết kế quan trọng trong lập trình. DI giúp đạt được mục tiêu nào sau đây?
A. Tăng tốc độ thực thi chương trình.
B. Giảm sự phụ thuộc giữa các thành phần (loose coupling), tăng tính module hóa và khả năng tái sử dụng.
C. Đơn giản hóa việc quản lý bộ nhớ.
D. Cải thiện hiệu suất garbage collection.
29. Trong Java, Reflection là gì?
A. Một kỹ thuật để tối ưu hóa mã bytecode.
B. Một API cho phép chương trình Java kiểm tra và thao tác thông tin về lớp, interface, constructor, method và field của chính nó tại runtime.
C. Một công cụ để debug mã Java.
D. Một framework để xây dựng ứng dụng web.
30. Giả sử bạn muốn đọc dữ liệu từ một file văn bản lớn trong Java. Cách nào sau đây hiệu quả nhất về mặt bộ nhớ?
A. Đọc toàn bộ file vào bộ nhớ sử dụng `Files.readAllBytes()` sau đó xử lý.
B. Đọc file theo từng dòng sử dụng `BufferedReader` và `FileReader`.
C. Sử dụng `Scanner` để đọc toàn bộ file.
D. Sử dụng `DataInputStream` để đọc file.