Đặc điểm Ngôn ngữ Java
Java hỗ trợ lập trình hướng đối tượng với ba nguyên lý: đóng gói, kế thừa và đa hình. Tính độc lập nền tảng đạt được thông qua máy ảo JVM, còn độ tin cậy được đảm bảo bằng cơ chế quản lý ngoại lệ và tự động giải phóng bộ nhớ. Tệp mã nguồn .java được biên dịch thành bytecode .class, sau đó JVM tải và thực thi từng dòng lệnh thông qua trình thông dịch.
So sánh Java và C++
Java chỉ hỗ trợ đơn kế thừa lớp nhưng cho phép đa kế thừa giao diện, khác với C++ hỗ trợ đa kế thừa trực tiếp. Java tích hợp cơ chế tự động thu gom rác (GC) thay vì yêu cầu lập trình viên quản lý bộ nhớ thủ công, đồng thời loại bỏ con trỏ để tăng tính an toàn.
Kiểu dữ liệu Nguyên thủy và Wrapper
Java cung cấp 8 kiểu dữ liệu nguyên thủy:
- byte, short, int, long (số nguyên)
- float, double (số thực)
- char (ký tự)
- boolean (logic)
Lớp wrapper tương ứng: Byte, Short, Integer, Long, Float, Double, Character, Boolean. Cơ chế cache tự động áp dụng cho giá trị phổ biến (vd: Integer cache [-128,127]).
Autoboxing/Unboxing
Autoboxing tự động chuyển kiểu nguyên thủy sang wrapper thông qua valueOf(), trong khi unboxing dùng phương thức như intValue() để chuyển ngược lại.
Biến Thành viên và Cục bộ
| Tiêu chí | Biến thành viên | Biến cục bộ |
|---|---|---|
| Phạm vi | Toàn lớp | Trong phương thức/khối |
| Bộ nhớ | Heap (khi không static) | Stack |
| Giá trị mặc định | Có | Không |
Quản lý Bộ nhớ JVM
Cấu trúc Bộ nhớ
- Vùng chia sẻ:
- Heap: Lưu đối tượng, chia thành Young Generation (Eden, Survivor) và Old Generation
- Metaspace: Lưu metadata lớp (Java 8+)
- Vùng riêng thread:
- Stack: Quản lý lệnh và biến cục bộ
- Bộ đếm chương trình (PC Register)
- Native Method Stack
Thuật toán Thu gom Rác
Xác định đối tượng rác bằng phân tích đạt tới (GC Roots). Các thuật toán chính:
- Copying: Dùng cho Young Generation, hiệu quả với đối tượng ngắn hạn
- Mark-Sweep-Compact: Dùng cho Old Generation, xử lý phân mảnh bộ nhớ
Bộ Thu gom Rác (GC)
- Serial GC: Đơn luồng, STW dài
- Parallel GC: Đa luồng, cải thiện hiệu năng
- CMS: Thu gom đồng thời, giảm STW
- G1: Phân vùng heap, cân bằng hiệu năng
Xử lý Ngoại lệ
Phân cấp ngoại lệ:
Throwable
├── Error (OutOfMemoryError)
└── Exception
├── Checked (IOException)
└── Unchecked (NullPointerException)
Quy tắc sử dụng:
throw: Ném ngoại lệ trong phương thứcthrows: Khai báo ngoại lệ tại signaturetry-catch-finally: Xử lý và dọn dẹp tài nguyên
Cơ chế Nạp Lớp
Quy trình nạp lớp:
- Bootstrap ClassLoader: Tải thư viện core JDK
- Extension ClassLoader: Tải lớp từ thư mục mở rộng
- Application ClassLoader: Tải lớp ứng dụng
Cơ chế ủy quyền kép đảm bảo lớp core chỉ được tải bởi Bootstrap Loader.
Reflection và Generics
Reflection cho phép kiểm tra và thao tác lớp tại runtime:
Class<?> clazz = Class.forName("com.example.MyClass");
Method method = clazz.getMethod("myMethod");
method.invoke(clazz.newInstance());
Generics đảm bảo kiểm tra kiểu tại compile-time:
public class Box<T> {
private T content;
public void set(T value) { this.content = value; }
}
Xử lý I/O
Phân loại luồng:
- Byte Stream:
InputStream/OutputStream - Character Stream:
Reader/Writer
Sử dụng bộ đệm để tối ưu hiệu năng:
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}