Bỏ qua để đến nội dung

ArrayList

Mảng (array) có kích thước cố định ngay khi tạo. Khi cần một danh sách có thể thêm/xóa phần tử linh hoạt, Java cung cấp ArrayList trong gói java.util:

import java.util.ArrayList;
import java.util.List;
List<String> names = new ArrayList<>(); // khai báo kiểu List, khởi tạo bằng ArrayList
names.add("An");
names.add("Bình");
names.add("Chi");
System.out.println(names); // [An, Bình, Chi]
System.out.println(names.size()); // 3 - dùng size(), không phải length

👉 Quy ước phổ biến: khai báo biến với kiểu interface List<E>, khởi tạo bằng class cụ thể ArrayList<>() - giúp dễ đổi sang cài đặt khác (như LinkedList) sau này mà không sửa phần còn lại của code.

2. ArrayList chỉ chứa kiểu đối tượng (generic)

Phần tiêu đề “2. ArrayList chỉ chứa kiểu đối tượng (generic)”

ArrayList<E> dùng generic - chỉ chứa được kiểu đối tượng (wrapper class), không chứa trực tiếp kiểu nguyên thủy:

List<Integer> numbers = new ArrayList<>(); // dùng Integer, KHÔNG phải int
numbers.add(10); // Java tự động "autoboxing" int -> Integer
List<String> fruits = new ArrayList<>();
fruits.add("táo");
fruits.add("cam");
fruits.add("xoài");
System.out.println(fruits.get(0)); // "táo" - lấy phần tử theo chỉ số
fruits.set(1, "chuối"); // sửa phần tử tại vị trí 1
fruits.remove(0); // xóa theo chỉ số
fruits.remove("xoài"); // xóa theo giá trị (gọi overload khác!)
System.out.println(fruits.contains("chuối")); // true
System.out.println(fruits.isEmpty()); // false
fruits.clear(); // xóa hết phần tử

⚠️ remove(int index)remove(Object obj) là hai overload khác nhau - list.remove(1) xóa theo chỉ số 1, không phải xóa giá trị 1. Với List<Integer>, muốn xóa theo giá trị phải viết list.remove(Integer.valueOf(1)).

List<String> fruits = new ArrayList<>(List.of("táo", "cam", "xoài"));
for (String fruit : fruits) { // for-each - cách phổ biến nhất
System.out.println(fruit);
}
for (int i = 0; i < fruits.size(); i++) { // cần chỉ số thì dùng for truyền thống
System.out.println(i + ": " + fruits.get(i));
}

⚠️ Thêm/xóa phần tử trong khi đang duyệt bằng for-each sẽ ném ConcurrentModificationException - xem chi tiết ở trang “Concurrent Modification Exception” trong mục What the Java!.

  • ArrayList là danh sách có thể thay đổi kích thước, thay thế cho mảng khi cần linh hoạt
  • Khai báo kiểu List<E>, khởi tạo bằng new ArrayList<>(); dùng size() thay vì length
  • Chỉ chứa kiểu đối tượng (generic) - kiểu nguyên thủy được tự động autobox
  • add(), get(), set(), remove(), contains() là các thao tác cơ bản nhất