Java Collection - Set
Giới thiệu về Set
Các thành viên trong dòng họ Set:
Set
kế thừa giao diệnCollection
. Trên thực tế,Set
chỉ làCollection
với một số hành vi khác nhau: tập hợp Set không cho phép các phần tử trùng lặp.SortedSet
kế thừa giao diệnSet
. Nội dung củaSortedSet
được sắp xếp theo thứ tự duy nhất, sắp xếp bằng cách sử dụng trình so sánh (Comparator).NavigableSet
kế thừa giao diệnSortedSet
. Nó cung cấp các phương thức tìm kiếm phong phú như “lấy phần tử lớn hơn / bằng một giá trị”, “lấy phần tử nhỏ hơn / bằng một giá trị”, v.v.AbstractSet
là một lớp trừu tượng, nó kế thừa từAbstractCollection
.AbstractCollection
triển khai hầu hết các phương thức của Set, cung cấp tiện ích cho các lớp thực hiện Set.HashSet
phụ thuộc vàoHashMap
, thực tế nó được triển khai bằng cách sử dụngHashMap
. Các phần tử trongHashSet
là không có thứ tự và phân tán.TreeSet
phụ thuộc vàoTreeMap
, thực tế nó được triển khai bằng cách sử dụngTreeMap
. Các phần tử trongTreeSet
được sắp xếp và được sắp xếp theo thứ tự tự nhiên hoặc theo trình so sánh do người dùng chỉ định.LinkedHashSet
là một Set được sắp xếp theo thứ tự chèn.EnumSet
chỉ chứa các phần tử của kiểu Enum.
Giao diện Set
Set
kế thừa giao diện Collection
. Trên thực tế, Set
chỉ là Collection
, hai giao diện này cung cấp các phương thức hoàn toàn giống nhau.
Định nghĩa giao diện Set
như sau:
Giao diện SortedSet
Kế thừa giao diện Set
. Nội dung của SortedSet
được sắp xếp theo thứ tự duy nhất, sắp xếp bằng cách sử dụng trình so sánh (Comparator).
Định nghĩa giao diện SortedSet
như sau:
Giao diện SortedSet
mở rộng các phương thức mới:
comparator
- Trả về trình so sánh (Comparator)subSet
- Trả về tập con trong khoảng chỉ địnhheadSet
- Trả về tập con nhỏ hơn phần tử chỉ địnhtailSet
- Trả về tập con lớn hơn phần tử chỉ địnhfirst
- Trả về phần tử đầu tiênlast
- Trả về phần tử cuối cùng- spliterator
Giao diện NavigableSet
Kế thừa giao diện SortedSet
. Nó cung cấp các phương thức tìm kiếm phong phú.
Định nghĩa giao diện NavigableSet
như sau:
Giao diện NavigableSet
mở rộng các phương thức mới:
lower
- Trả về phần tử gần nhất nhỏ hơn giá trị chỉ địnhhigher
- Trả về phần tử gần nhất lớn hơn giá trị chỉ địnhfloor
- Trả về phần tử gần nhất nhỏ hơn hoặc bằng giá trị chỉ địnhceiling
- Trả về phần tử gần nhất lớn hơn hoặc bằng giá trị chỉ địnhpollFirst
- Lấy và xóa phần tử đầu tiên (nhỏ nhất)pollLast
- Lấy và xóa phần tử cuối cùng (lớn nhất)descendingSet
- Trả về tập hợp được sắp xếp theo thứ tự ngược lạidescendingIterator
- Trả về trình lặp tập hợp được sắp xếp theo thứ tự ngược lạisubSet
- Trả về tập con trong khoảng chỉ địnhheadSet
- Trả về tập con nhỏ hơn phần tử chỉ địnhtailSet
- Trả về tập con lớn hơn phần tử chỉ định
Lớp AbstractSet
Lớp AbstractSet
cung cấp cài đặt cốt lõi cho giao diện Set
, giúp giảm thiểu công việc cần thiết để triển khai các lớp thực thể của Set
.
Định nghĩa lớp AbstractSet
như sau:
Thực tế, hầu hết các cài đặt chính đã được thực hiện trong AbstractCollection
.
Lớp HashSet
Lớp HashSet
phụ thuộc vào HashMap
, thực tế nó được triển khai bằng cách sử dụng HashMap
. Các phần tử trong HashSet
không có thứ tự và phân tán.
Định nghĩa lớp HashSet
như sau:
Điểm chính của HashSet
HashSet
triển khai các phương thức cốt lõi củaSet
thông qua việc kế thừa từAbstractSet
.HashSet
triển khaiCloneable
, vì vậy hỗ trợ việc sao chép.HashSet
triển khaiSerializable
, vì vậy hỗ trợ việc tuần tự hóa.- Các phần tử trong
HashSet
không có thứ tự. HashSet
cho phép phần tử null.HashSet
không an toàn đối với luồng.
Nguyên lý của HashSet
HashSet
được triển khai dựa trên HashMap
.
HashSet
duy trì một đối tượngHashMap
có tên làmap
trong nội bộ. Các phương thức quan trọng củaHashSet
nhưadd
,remove
,iterator
,clear
,size
đều được triển khai dựa trênmap
.- Lớp
HashSet
xác định cơ chế tuần tự hóa và giải tuần tự hóa thông qua việc định nghĩa các phương thứcwriteObject()
vàreadObject()
.
- Lớp
PRESENT
được sử dụng để liên kết phần tử hiện tại trongmap
.
Lớp TreeSet
Lớp TreeSet
phụ thuộc vào TreeMap
, thực tế nó được triển khai bằng cách sử dụng TreeMap
. Các phần tử trong TreeSet
được sắp xếp và được sắp xếp theo thứ tự tự nhiên hoặc theo trình so sánh do người dùng chỉ định.
Định nghĩa lớp TreeSet
như sau:
Điểm chính của TreeSet
TreeSet
triển khai các phương thức cốt lõi củaNavigableSet
thông qua việc kế thừa từAbstractSet
.TreeSet
triển khaiCloneable
, vì vậy hỗ trợ việc sao chép.TreeSet
triển khaiSerializable
, vì vậy hỗ trợ việc tuần tự hóa.- Các phần tử trong
TreeSet
được sắp xếp. Quy tắc sắp xếp dựa trên thứ tự tự nhiên hoặc trình so sánh (Comparator) do người dùng chỉ định. TreeSet
không an toàn đối với luồng.
Mã nguồn của TreeSet
TreeSet
được triển khai dựa trên TreeMap
.
TreeSet
duy trì một đối tượngNavigableMap
có tên làm
trong nội bộ (thực tế là một đối tượngTreeMap
). Các phương thức quan trọng củaTreeSet
nhưadd
,remove
,iterator
,clear
,size
đều được triển khai dựa trênm
.PRESENT
được sử dụng để liên kết phần tử hiện tại trongmap
. Các phần tử trongTreeSet
được coi là các khóa trongTreeMap
, và giá trị của chúng làPRESENT
.
Lớp LinkedHashSet
LinkedHashSet
là một Set được sắp xếp theo thứ tự chèn.
Định nghĩa lớp LinkedHashSet
như sau:
Điểm chính của LinkedHashSet
LinkedHashSet
triển khai các phương thức cốt lõi củaSet
thông qua việc kế thừa từHashSet
.LinkedHashSet
triển khaiCloneable
, vì vậy hỗ trợ việc sao chép.LinkedHashSet
triển khaiSerializable
, vì vậy hỗ trợ việc tuần tự hóa.- Các phần tử trong
LinkedHashSet
được lưu trữ theo thứ tự chèn. LinkedHashSet
không an toàn đối với luồng.
Nguyên lý của LinkedHashSet
LinkedHashSet
có ba phương thức khởi tạo, tất cả đều gọi phương thức khởi tạo của lớp cha HashSet
.
Cần lưu ý rằng: Phương thức khởi tạo của LinkedHashSet thực tế gọi phương thức khởi tạo không public của lớp cha HashSet.
Khác với phương thức khởi tạo public của HashSet
mà khởi tạo một đối tượng HashMap
, phương thức này khởi tạo một đối tượng LinkedHashMap
.
Điều này có nghĩa là LinkedHashSet
duy trì một danh sách liên kết hai chiều. Với tính chất của danh sách liên kết hai chiều, nó lưu trữ các phần tử theo thứ tự chèn. Vì vậy, đây là nguyên lý lưu trữ các phần tử trong LinkedHashSet
theo thứ tự chèn.
Lớp EnumSet
Định nghĩa lớp EnumSet
như sau:
Điểm chính của EnumSet
EnumSet
kế thừa từAbstractSet
, vì vậy có các phương thức cốt lõi củaSet
.EnumSet
triển khaiCloneable
, vì vậy hỗ trợ việc sao chép.EnumSet
triển khaiSerializable
, vì vậy hỗ trợ việc tuần tự hóa.EnumSet
giới hạn các phần tử lưu trữ phải là giá trị Enum.EnumSet
không có constructor, chỉ có thể tạo đối tượngEnumSet
thông qua các phương thứcstatic
trong lớp.EnumSet
có thứ tự. Thứ tự của các phần tử trongEnumSet
dựa trên thứ tự định nghĩa của chúng trong lớp Enum.EnumSet
không an toàn đối với luồng.