ArrayList và Khái Niệm Generic
ArrayList là một cấu trúc dữ liệu thuộc Collections Framework trong Java, cho phép lưu trữ danh sách các phần tử với kích thước động.
ArrayList<String> danhSach = new ArrayList<>();
Khi khai báo ArrayList, chúng ta sử dụng cặp dấu ngoặc nhọn <E> để chỉ định kiểu dữ liệu (generic). Generic đảm bảo tất cả phần tử trong danh sách đều cùng một kiểu tham chiếu. Lưu ý rằng generic chỉ chấp nhận kiểu tham chiếu (reference type), không chấp nhận kiểu nguyên thủy (primitive type).
So Sánh ArrayList với Mảng
- Mảng (Array) có kích thước cố định sau khi khởi tạo.
ArrayListcó kích thước linh hoạt, có thể thay đổi trong thời gian chạy.
Một điểm khác biệt nữa là khi in trực tiếp một đối tượng ArrayList, kết quả nhận được là nội dung của danh sách chứ không phải địa chỉ bộ nhớ. Nếu danh sách rỗng, kết quả sẽ là [].
Các Phương Thức Thường Dùng của ArrayList
public boolean add(E e): Thêm phần tử vào cuối danh sách. Kiểu tham số phải khớp với generic. Giá trị trả về cho biết việc thêm có thành công hay không (vớiArrayList, phương thức này luôn thành công).public E get(int index): Truy xuất phần tử tại vị trí chỉ mục (bắt đầu từ 0).public E remove(int index): Xóa phần tử tại vị trí chỉ mục và trả về phần tử đó.public int size(): Trả về số lượng phần tử hiện có trong danh sách.
Làm Việc với Kiểu Nguyên Thủy và Wrapper Class
Để lưu trữ dữ liệu kiểu nguyên thủy trong ArrayList, ta phải sử dụng các lớp Wrapper tương ứng.
// Sai: ArrayList<int> list = new ArrayList<>();
// Đúng: ArrayList<Integer> list = new ArrayList<>();
Các cặp kiểu nguyên thủy và Wrapper class tương ứng:
byte-Byteshort-Shortint-Integerlong-Longfloat-Floatdouble-Doublechar-Characterboolean-Boolean
Từ JDK 1.5 trở lên, Java hỗ trợ cơ chế autoboxing (tự động đóng gói kiểu nguyên thủy thành Wrapper) và unboxing (tự động giải gói Wrapper về kiểu nguyên thủy).
Ví Dụ 1: Tạo và Duyệt Danh Sách Số Ngẫu Nhiên
Yêu cầu: Tạo một danh sách chứa 6 số nguyên ngẫu nhiên trong khoảng từ 1 đến 33, sau đó in ra danh sách đó.
import java.util.ArrayList;
import java.util.Random;
public class ViDuNgauNhien {
public static void main(String[] args) {
ArrayList<Integer> danhSachSo = new ArrayList<>();
Random boNgauNhien = new Random();
for (int i = 0; i < 6; i++) {
int giaTri = boNgauNhien.nextInt(33) + 1; // Sinh số từ 1 đến 33
danhSachSo.add(giaTri);
}
// Duyệt và in danh sách
for (int i = 0; i < danhSachSo.size(); i++) {
System.out.println("Phần tử tại vị trí " + i + ": " + danhSachSo.get(i));
}
}
}
Ví Dụ 2: Lọc Số Chẵn từ Danh Sách Lớn bằng Phương Thức Tùy Chỉnh
Yêu cầu: Tạo một danh sách lớn chứa 20 số nguyên ngẫu nhiên từ 1 đến 100. Viết một phương thức để lọc ra tất cả số chẵn từ danh sách lớn đó và đưa vào một danh sách nhỏ mới.
import java.util.ArrayList;
import java.util.Random;
public class LocSoChan {
public static void main(String[] args) {
ArrayList<Integer> danhSachLon = new ArrayList<>();
Random boNgauNhien = new Random();
// Thêm 20 số ngẫu nhiên vào danh sách lớn
for (int i = 0; i < 20; i++) {
int so = boNgauNhien.nextInt(100) + 1; // 1 đến 100
danhSachLon.add(so);
}
// Gọi phương thức lọc để nhận danh sách số chẵn
ArrayList<Integer> danhSachChan = locSoChan(danhSachLon);
// Hiển thị kết quả
System.out.println("Tổng số lượng số chẵn: " + danhSachChan.size());
for (int so : danhSachChan) {
System.out.println(so);
}
}
/**
* Phương thức lọc các số chẵn từ một danh sách đầu vào.
* @param danhSachNguon Danh sách chứa các số nguyên cần lọc.
* @return Danh sách mới chỉ chứa các số chẵn.
*/
public static ArrayList<Integer> locSoChan(ArrayList<Integer> danhSachNguon) {
ArrayList<Integer> ketQua = new ArrayList<>();
for (int giaTri : danhSachNguon) {
if (giaTri % 2 == 0) {
ketQua.add(giaTri);
}
}
return ketQua;
}
}