Cả hai đều implement interface Set (không cho phép trùng lặp). HashSet backed by HashMap, TreeSet backed by TreeMap (Red-Black Tree).
Bảng so sánh chi tiết
| STT | Tiêu chí | HashSet | TreeSet |
|---|---|---|---|
| 1 | Cấu trúc dữ liệu | Hash Table (HashMap nội bộ) | Cây đỏ-đen (TreeMap - Red-Black Tree) |
| 2 | Null object | Cho phép một null element | Không cho phép null (ném NullPointerException) |
| 3 | So sánh đối tượng | Dùng equals() và hashCode() |
Dùng compareTo() (Comparable) hoặc Comparator |
| 4 | Đối tượng heterogeneous | Cho phép (miễn implement equals/hashCode đúng) | Không cho phép (phải so sánh được với nhau) |
| 5 | Thứ tự | Không đảm bảo thứ tự (unordered) | Luôn duy trì thứ tự tự nhiên (sorted) |
| 6 | Độ phức tạp | O(1) trung bình cho add/remove/contains | O(log n) cho add/remove/contains |
Ví dụ TreeSet (Sorted)
TreeSet<String> treeSet = new TreeSet<>();
treeSet.add("Good");
treeSet.add("For");
treeSet.add("Health");
treeSet.add("Good"); // Duplicate bị loại
// Output: For, Good, Health (theo alphabet)
Ví dụ HashSet (Unordered)
HashSet<String> hashSet = new HashSet<>();
hashSet.add("Good");
hashSet.add("For");
hashSet.add("Health");
hashSet.add("Good"); // Duplicate bị loại
// Output: Thứ tự ngẫu nhiên, ví dụ: Health, For, Good
Khi nào dùng cái nào?
- HashSet: Cần hiệu suất cao (O(1)), không quan tâm thứ tự, kiểm tra tồn tại nhanh.
- TreeSet: Cần dữ liệu luôn sorted, range queries (
subSet,headSet,tailSet), tìm min/max nhanh.
Lưu ý
Với TreeSet, object phải implement Comparable hoặc cung cấp Comparator khi tạo. Tất cả element phải mutually comparable (so sánh được với nhau) để tránh ClassCastException.