Các Khái niệm Trọng tâm về Cú pháp Java
Phân loại Kiểu Dữ liệu
Java định nghĩa 8 kiểu nguyên thủy với đặc điểm lưu trữ và giá trị mặc định riêng:
| Kiểu | Giá trị mặc định | Kích thước |
|---|---|---|
| boolean | false | Không xác định |
| char | '\u0000' | 2 byte |
| byte | 0 | 1 byte |
| short | 0 | 2 byte |
| int | 0 | 4 byte |
| long | 0L | 8 byte |
| float | 0.0f | 4 byte |
| double | 0.0 | 8 byte |
Quản lý Bộ nhớ: Bit và Byte
- Bit (b) là đơn vị nhỏ nhất, biểu diễn giá trị nhị phân 0/1
- Byte (B) = 8 bit, dùng lưu trữ ký tự Latinh (1 byte) hoặc tiếng Trung (2 byte)
- Hệ thống đơn vị: 1KB = 1024 byte, 1MB = 1024KB, v.v.
Đối tượng String và Kiểu Nguyên thủy
String không thuộc nhóm 8 kiểu nguyên thủy, mà là lớp đối tượng. Các kiểu nguyên thủy bao gồm: byte, short, int, long, float, double, char, boolean.
Cơ chế Cache cho Lớp Wrapper
Các lớp bọc (Byte, Short, Integer, Long, Character, Boolean) sử dụng cache để tối ưu hiệu năng. Giá trị cache mặc định:
| Lớp | Phạm vi Cache |
|---|---|
| Byte | -128 đến 127 |
| Short | -128 đến 127 |
| Integer | -128 đến 127 |
| Character | U+0000 đến U+007F |
| Boolean | true/false |
Tham số JVM -XX:AutoBoxCacheMax cho phép mở rộng phạm vi cache.
Xử lý Mảng trong Java
Khởi tạo Mảng
// Khai báo và cấp phát bộ nhớ
int[] numbers = new int[5];
numbers[0] = 10;
// Khởi tạo trực tiếp
String[] fruits = {"Táo", "Chuối", "Dứa"};
// Cách tường minh
double[] measurements = new double[]{3.14, 2.718, 1.618};
In Mảng Đa chiều
// In mảng 1 chiều
System.out.println(Arrays.toString(fruits));
// Kết quả: [Táo, Chuối, Dứa]
// In mảng 2 chiều
String[][] matrix = {{"A", "B"}, {"C", "D"}};
System.out.println(Arrays.deepToString(matrix));
// Kết quả: [[A, B], [C, D]]
Đặc điểm của Chuỗi Ký tự
Phân biệt String và Đối tượng
Khi khởi tạo:
String text1 = "Java"; // Chỉ tạo 1 đối tượng trong pool
String text2 = new String("Java"); // Tạo 2 đối tượng (pool + heap)
Nên dùng cách thứ nhất để tối ưu hiệu năng.
So sánh 3 Lớp Xử lý Chuỗi
- String: Bất biến, dùng cho dữ liệu nhỏ
- StringBuilder: Biến đổi được, không an toàn đa luồng, hiệu suất cao
- StringBuffer: Biến đổi được, an toàn đa luồng, hiệu suất thấp hơn
Thay đổi Vị trí String Pool qua Phiên bản
- Trước Java 7: Pool nằm trong vùng PermGen (thuộc heap)
- Java 7: Di chuyển pool vào heap chính để tránh lỗi OutOfMemory
- Java 8+: Thay PermGen bằng Metaspace (sử dụng bộ nhớ hệ thống), loại bỏ giới hạn kích thước
Metaspace giúp giảm thiểu Full GC và quản lý bộ nhớ hiệu quả hơn.