1. Khái niệm Collection
Collection là container lưu trữ dữ liệu tương tự mảng. Khác biệt chính: kích thước mảng cố định khi khởi tạo, trong khi ArrayList có thể thay đổi kích thước linh hoạt.
2. Gói thư viện
Lớp ArrayList nằm trong gói java.util
3. Phương thức khởi tạo
| Phương thức | Mô tả |
|---|---|
| ArrayList() | Tạo danh sách rỗng với dung lượng mặc định 10 phần tử |
| ArrayList(int capacity) | Tạo danh sách rỗng với dung lượng chỉ định |
| ArrayList(Collection c) | Tạo danh sách từ các phần tử của collection khác |
4. Phương thức thường dùng
| Phương thức | Chức năng |
|---|---|
| add(E item) | Thêm phần tử vào cuối danh sách |
| add(int index, E item) | Chèn phần tử tại vị trí xác định |
| get(int index) | Lấy phần tử tại vị trí chỉ định |
| size() | Trả về số lượng phần tử |
| remove(int index) | Xóa phần tử tại vị trí và trả về giá trị đã xóa |
| remove(Object obj) | Xóa phần tử đầu tiên trùng khớp, trả về kết quả boolean |
| set(int index, E item) | Thay thế phần tử tại vị trí chỉ định |
public static void main(String[] args) {
ArrayList<String> heroes = new ArrayList<>();
heroes.add("Ashe");
heroes.add("Yasuo");
System.out.println(heroes); // [Ashe, Yasuo]
// Duyệt danh sách
for(int i = 0; i < heroes.size(); i++) {
System.out.println(heroes.get(i));
}
heroes.add(1, "Zed");
System.out.println(heroes.get(2)); // Yasuo
System.out.println(heroes.remove(0)); // Ashe
System.out.println(heroes.set(1, "Lee Sin")); // Yasuo
}
5. Lưu ý quan trọng
(1) Kiểu generic <E> xác định loại phần tử trong ArrayList, chỉ chấp nhận kiểu tham chiếu
(2) Khi in ArrayList, kết quả hiển thị nội dung thay vì địa chỉ bộ nhớ
(3) Để lưu trữ kiểu nguyên thủy, sử dụng lớp wrapper tương ứng:
| Kiểu nguyên thủy | Lớp Wrapper |
|---|---|
| int | Integer |
| double | Double |
| char | Character |
| boolean | Boolean |
Từ JDK 1.5+, Java hỗ trợ auto-boxing (tự động chuyển kiểu nguyên thủy thành wrapper) và auto-unboxing (thực hiện ngược lại).
(4) Lỗi thường gặp khi xóa phần tử trong vòng lặp:
ArrayList<String> data = new ArrayList<>();
data.add("A*");
data.add("Valid");
data.add("*B");
data.add("C*");
// Cách 1: Giảm chỉ số sau khi xóa
for(int i = 0; i < data.size(); i++) {
if(data.get(i).contains("*")) {
data.remove(i);
i--;
}
}
// Cách 2: Duyệt từ cuối danh sách
for(int i = data.size()-1; i >= 0; i--) {
if(data.get(i).contains("*")) {
data.remove(i);
}
}