Chapter 10. Arrays
Quotes:Chạy đua với cuộc sống rất mệt tôi biết. Nhưng trở thành kẻ thất bại thì sẽ khổ.
🔥 1. Giới thiệu về Mảng trong Java
Mảng (Array) là một tập hợp các phần tử có cùng kiểu dữ liệu và được lưu trữ liên tiếp trong bộ nhớ.
Mảng có kích thước cố định khi khởi tạo và không thể thay đổi sau đó.
Mảng trong Java là đối tượng và được quản lý bởi Garbage Collector (GC).
📌 Ví dụ về khai báo mảng:
🔥 2. Khai báo, Khởi tạo và Truy xuất Mảng
a) Khai báo và khởi tạo mảng
Có 3 cách để khởi tạo mảng trong Java:
1️⃣ Khai báo trước, khởi tạo sau:
2️⃣ Khai báo và khởi tạo cùng lúc:
3️⃣ Khởi tạo bằng danh sách phần tử:
b) Truy xuất phần tử trong mảng
Chỉ số (index) của mảng bắt đầu từ
0
.Dùng toán tử
[]
để truy xuất phần tử.
📌 Ví dụ:
⚠ Lỗi phổ biến: Nếu truy xuất ngoài phạm vi (index < 0
hoặc index >= length
), Java sẽ ném lỗi ArrayIndexOutOfBoundsException
.
🔥 3. Thuộc tính length
của mảng
length
của mảngDùng array.length
để lấy độ dài của mảng.
📌 Ví dụ:
🔥 4. Duyệt mảng (Loop through Arrays)
Có 3 cách để duyệt mảng:
a) Dùng vòng lặp for
(Cách truyền thống)
for
(Cách truyền thống)**b) Dùng vòng lặp foreach
(Enhanced for-loop)
foreach
(Enhanced for-loop)c) Dùng Arrays.stream()
(Java 8+)
Arrays.stream()
(Java 8+)🔥 5. Mảng nhiều chiều (Multidimensional Arrays)
Java hỗ trợ mảng 2D, 3D, … (nhiều chiều).
📌 Khai báo mảng 2 chiều:
📌 Gán giá trị ban đầu:
📌 Truy xuất phần tử trong mảng 2D:
📌 Duyệt mảng 2D bằng vòng lặp lồng nhau:
🔥 6. Mảng không đối xứng (Jagged Array)
Mảng không đối xứng là mảng có số phần tử mỗi hàng khác nhau.
📌 Ví dụ:
🔥 7. Ép kiểu với Mảng
a) Ép kiểu ngầm định
Java tự động chuyển đổi kiểu dữ liệu khi mảng có thể chứa kiểu con của lớp cha.
📌 Ví dụ:
b) Ép kiểu tường minh
Dùng ép kiểu tường minh khi chuyển từ Object[]
về kiểu cụ thể.
📌 Ví dụ:
⚠ Nếu ép kiểu sai, sẽ có lỗi ClassCastException
:
🔥 8. Mảng và Generics
Java không thể tạo mảng kiểu generic trực tiếp vì không an toàn kiểu (Type Safety
).
📌 Lỗi phổ biến khi dùng Generics với mảng:
📌 Cách giải quyết bằng @SuppressWarnings("unchecked")
:
🔥 9. Mảng trong java.util.Arrays
java.util.Arrays
Lớp java.util.Arrays
hỗ trợ nhiều phương thức tiện ích cho mảng.
📌 Ví dụ về các phương thức phổ biến:
🔥 10. Tóm tắt
✅ Mảng là tập hợp các phần tử cùng kiểu dữ liệu.
✅ Dùng array.length
để lấy kích thước mảng.
✅ Mảng nhiều chiều được khai báo bằng [][]
.
✅ Mảng không đối xứng có số phần tử mỗi hàng khác nhau.
✅ Không thể tạo mảng Generic trực tiếp.
✅ Dùng Arrays
để xử lý mảng dễ dàng hơn.
BONUS
Mảng trong Java được lưu ở đâu trong bộ nhớ máy tính?
Trong Java, mảng là một đối tượng (Object
), vì vậy nó được lưu trữ trên Heap Memory (Bộ nhớ Heap).
💡 Heap Memory là vùng nhớ dành cho các đối tượng trong Java và được quản lý bởi Garbage Collector (GC).
📌 1. Bộ nhớ trong Java
Vùng nhớ
Mô tả
Stack Memory
Lưu trữ biến cục bộ (local variables), con trỏ tham chiếu, dữ liệu của từng thread.
Heap Memory
Chứa đối tượng (Object), bao gồm cả các mảng, được quản lý bởi Garbage Collector.
Method Area
Chứa metadata của class, phương thức tĩnh, biến tĩnh.
PC Register
Lưu trữ địa chỉ lệnh hiện tại của thread.
Native Stack
Dùng cho các lệnh native, thường liên quan đến JNI (Java Native Interface).
📌 2. Cách mảng được lưu trong bộ nhớ
🔹 a) Khi khai báo và khởi tạo mảng
Khi bạn tạo một mảng trong Java, trình biên dịch sẽ cấp phát bộ nhớ trên Heap và lưu một tham chiếu đến nó trong Stack. 📌 Ví dụ 1:
📌 Cách lưu trữ trong bộ nhớ:
arr
(tham chiếu) lưu trong Stack.Mảng thực tế (
{0, 0, 0, 0, 0}
) được lưu trên Heap.
📌 Hình minh họa:
🔹 b) Khi mảng chứa kiểu dữ liệu nguyên thủy (Primitive)
Các kiểu dữ liệu nguyên thủy (int
, double
, boolean
, v.v.) được lưu trực tiếp trên Heap, vì mảng là một đối tượng.
📌 Ví dụ 2:
📌 Cách lưu trữ:
Tham chiếu
numbers
lưu trên Stack.Mảng
{1, 2, 3, 4, 5}
lưu trên Heap.
🔹 c) Khi mảng chứa kiểu dữ liệu tham chiếu (Object)
Nếu mảng chứa các đối tượng (ví dụ String
), thì các phần tử trong mảng chỉ chứa tham chiếu đến đối tượng trên Heap, chứ không chứa giá trị thực tế.
📌 Ví dụ 3:
📌 Cách lưu trữ:
names
(tham chiếu) lưu trên Stack.Mảng
String[]
(chứa địa chỉ của từngString
) nằm trên Heap.Mỗi
String
cũng là một đối tượng nằm riêng trên Heap.
📌 Hình minh họa:
🔹 d) Mảng nhiều chiều (Multidimensional Arrays)
Mảng nhiều chiều thực chất là mảng của mảng. Mỗi phần tử trong mảng trỏ đến một mảng khác trên Heap.
📌 Ví dụ 4:
📌 Cách lưu trữ:
matrix
(tham chiếu) lưu trên Stack.Mảng
matrix[0]
,matrix[1]
,matrix[2]
là các mảng con trên Heap.Các giá trị số nguyên được lưu trực tiếp trong các mảng con trên Heap.
📌 3. Garbage Collection và Mảng
Do mảng là đối tượng trên Heap, nó sẽ được Garbage Collector (GC) thu hồi nếu không còn tham chiếu nào trỏ đến nó.
📌 Ví dụ 5:
Mảng {1, 2, 3}
không còn tham chiếu nào → GC sẽ giải phóng bộ nhớ.
📌 4. Tổng kết
✅ Mảng trong Java là đối tượng, được lưu trên Heap. ✅ Biến tham chiếu của mảng nằm trên Stack. ✅ Nếu mảng chứa kiểu nguyên thủy, giá trị lưu trực tiếp trên Heap. ✅ Nếu mảng chứa đối tượng, chỉ lưu tham chiếu đến đối tượng trên Heap. ✅ Mảng nhiều chiều là mảng của mảng, mỗi hàng là một mảng riêng trên Heap. ✅ Mảng sẽ bị thu hồi nếu không còn tham chiếu nào trỏ đến nó (Garbage Collection).
Last updated