Bảng so sánh nhanh
| Tiêu chí | ArrayList | HashSet |
| Interface triển khai | List | Set |
| Cấu trúc nội bộ | Mảng động (dynamic array) | HashMap (key = element, value = dummy) |
| Thứ tự phần tử | Giữ thứ tự thêm (insertion order) | Không đảm bảo thứ tự (unordered) |
| Cho phép trùng lặp | Có | Không (unique elements) |
| Truy xuất bằng index | Hỗ trợ get(index), remove(index) – O(1) | Không có index, không có get() |
| Phần tử null | Cho phép nhiều null | Chỉ cho phép tối đa 1 null |
| Hiệu năng tìm kiếm | O(n) – duyệt tuần tự | O(1) trung bình (hash-based) |
| Gói (package) | java.util | java.util |
Ví dụ ArrayList
import java.util.*;
public class ArrayListDemo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(5);
for (int i = 1; i <= 5; i++) list.add(i);
System.out.println(list); // [1, 2, 3, 4, 5]
list.remove(3); // xóa index 3 (phần tử 4)
System.out.println(list); // [1, 2, 3, 5]
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " "); // 1 2 3 5
}
}
}
Ví dụ HashSet
import java.util.*;
public class HashSetDemo {
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
set.add(4); // trùng lặp -> bỏ qua
for (Integer n : set) {
System.out.print(n + " "); // thứ tự không xác định, ví dụ: 1 2 3 4
}
}
}
Khi nào dùng cái nào?
- ArrayList: Cần giữ thứ tự, truy xuất theo index, cho phép trùng lặp.
- HashSet: Cần tập hợp duy nhất (unique), kiểm tra tồn tại nhanh (contains), không quan tâm thứ tự.