ArrayList
1. Vì sao cần ArrayList?
Phần tiêu đề “1. Vì sao cần 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 intnumbers.add(10); // Java tự động "autoboxing" int -> Integer3. Các thao tác thường dùng
Phần tiêu đề “3. Các thao tác thường dùng”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í 1fruits.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")); // trueSystem.out.println(fruits.isEmpty()); // falsefruits.clear(); // xóa hết phần tử⚠️ remove(int index) và 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)).
4. Duyệt ArrayList
Phần tiêu đề “4. Duyệt ArrayList”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!.
Tổng kết
Phần tiêu đề “Tổng kết”ArrayListlà 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ằngnew ArrayList<>(); dùngsize()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