Chuyển đến nội dung chính
Mô-đun 4 · Bài học 2 trong tổng số 28/14 trong khóa học~15 min
Bài học theo mô-đun (2/2)

Bộ sưu tập và ArrayList

Mảng truyền thống trong Java có kích thước cố định được xác định tại thời điểm tạo. Để làm việc với danh sách dữ liệu có kích thước có thể thay đổi linh hoạt, Java cung cấp Khung tập hợp Java. Lớp được sử dụng phổ biến nhất là ArrayList.

Lớp ArrayList và Generics

ArrayList triển khai một mảng có thể thay đổi kích thước trong bộ nhớ. Để khai báo một ArrayList, chúng ta phải chỉ định loại phần tử mà nó sẽ chứa bằng cách đặt nó trong dấu ngoặc nhọn < >. Tính năng này được gọi là Generics.

Để sử dụng ArrayList, chúng ta phải nhập nó vào đầu tệp từ java.util.ArrayList.

Khai báo và khởi tạo:

Java
import java.util.ArrayList;

ArrayList<String> shoppingList = new ArrayList<>();

Phương pháp cốt lõi

Dưới đây là các thao tác cơ bản trên ArrayList:

  1. add(element): Thêm một phần tử vào cuối danh sách.
  2. get(index): Trả về phần tử tại chỉ mục đã chỉ định (có chỉ mục 0).
  3. size(): Trả về số phần tử hiện có trong danh sách.
  4. remove(index): Xóa phần tử tại chỉ mục đã chỉ định.
Java
shoppingList.add("Pane");
shoppingList.add("Latte");

System.out.println("Elementi: " + shoppingList.size()); // Prints 2
System.out.println("Primo elemento: " + shoppingList.get(0)); // Prints "Pane"

Lặp lại một danh sách (Cho mỗi danh sách)

Vòng lặp for-each là cấu trúc lý tưởng để lặp qua tất cả các phần tử của một bộ sưu tập:

Java
for (String item : shoppingList) {
    System.out.println(item);
}

Mảng vs ArrayList: Bộ nhớ và hiệu suất

Mặc dù ArrayList linh hoạt hơn nhiều so với mảng tĩnh nhưng nó đi kèm với sự đánh đổi về hiệu suất và bộ nhớ:

  • Mảng tĩnh: Được phân bổ trong một khối bộ nhớ liền kề, có kích thước cố định và việc truy cập các phần tử thông qua chỉ mục cực kỳ nhanh chóng. Nó lưu trữ các kiểu nguyên thủy trực tiếp mà không cần phí.
  • ArrayList: Trong nội bộ, nó quản lý một mảng được thay đổi kích thước (bằng cách tạo một mảng mới lớn hơn và sao chép các phần tử cũ) khi vượt quá dung lượng ban đầu (thường là 10). Hơn nữa, nó chỉ lưu trữ các tham chiếu đối tượng, đưa ra chi phí bộ nhớ cho từng phần tử.

Tự động đóng hộp và mở hộp

Vì ArrayList chỉ có thể giữ các đối tượng nên Java tự động thực hiện chuyển đổi giữa các kiểu nguyên thủy và các lớp trình bao bọc tương ứng của chúng:

  • Autoboxing: Tự động chuyển đổi từ kiểu nguyên thủy sang lớp bao bọc. Ví dụ: khi bạn viết numbers.add(42), Java sẽ tự động chuyển đổi 42 (int) thành Integer.valueOf(42) (Số nguyên).
  • Mở hộp: Tự động chuyển đổi từ lớp bao bọc sang kiểu nguyên thủy. Ví dụ: khi bạn thực thi int num = numbers.get(0), Java sẽ chuyển đổi nội bộ Integer thành int.

Hãy tự mình thử

tập thể dục#java.m4.l2.e1
Nỗ lực: 0Đang tải…

Nhập ArrayList, khai báo một ArrayList gồm các tên có tên Chuỗi. Thêm Alice và Bob vào danh sách, sau đó in kích thước của nó bằng phương thức size().

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Bao gồm `import java.util.ArrayList;` ở trên cùng. Tạo danh sách với `ArrayList<String>names = new ArrayList<>();`, thêm các phần tử và in kích thước của nó bằng `names.size()`.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#java.m4.l2.e2
Nỗ lực: 0Đang tải…

Khai báo một ArrayList gồm các số nguyên được đặt tên, cộng số 42 và in nó bằng cách truy xuất nó ở chỉ mục 0 bằng cách sử dụng get().

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Sử dụng `ArrayList<Integer> number = new ArrayList<>();` (với lớp trình bao bọc Integer) và in nó bằng `System.out.println(numbers.get(0));`.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#java.m4.l2.e3
Nỗ lực: 0Đang tải…

Khai báo một ArrayList gồm các màu có tên Chuỗi. Thêm các màu Đỏ, Xanh lục và Xanh lam vào danh sách. Cuối cùng, sử dụng vòng lặp for-each để lặp qua danh sách và in từng màu ra màn hình.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Khai báo danh sách bằng `ArrayList<String> color = new ArrayList<>();`, thêm ba màu và sử dụng vòng lặp `for (String c :colors)` để in chúng bằng `System.out.println(c);`.

Giải pháp khả dụng sau 3 lần thử