Thấy đoạn mã như thế nào
Set<Record> instances = new HashSet<Record>();
Tôi đang tự hỏi liệu Hashset có phải là một loại tập hợp đặc biệt hay không. Bất kỳ sự khác biệt giữa chúng?
Thấy đoạn mã như thế nào
Set<Record> instances = new HashSet<Record>();
Tôi đang tự hỏi liệu Hashset có phải là một loại tập hợp đặc biệt hay không. Bất kỳ sự khác biệt giữa chúng?
Câu trả lời:
A Set
đại diện cho một "bộ giá trị" chung. A TreeSet
là tập hợp mà các phần tử được sắp xếp (và do đó có thứ tự), a HashSet
là tập hợp mà các phần tử không được sắp xếp hoặc có thứ tự.
A HashSet
thường nhanh hơn rất nhiều so với a TreeSet
.
A TreeSet
thường được triển khai dưới dạng cây đỏ đen (Xem http://en.wikipedia.org/wiki/Red-black_tree - Tôi chưa xác thực việc triển khai thực tế của sun / oracle TreeSet
), trong khi một HashSet
sử dụng Object.hashCode()
để tạo chỉ mục trong một mảng. Thời gian truy cập cho cây đỏ đen là O(log(n))
thời gian truy cập trong HashSet
phạm vi từ thời gian không đổi đến trường hợp xấu nhất (mọi mục có cùng Mã băm) nơi bạn có thể có thời gian tìm kiếm tuyến tính O(n)
.
Câu hỏi đã được trả lời, nhưng tôi chưa thấy câu trả lời tại sao mã đề cập đến cả hai loại trong cùng một mã.
Thông thường, bạn muốn viết mã dựa trên các giao diện mà trong trường hợp này là Đặt. Tại sao? Bởi vì nếu bạn luôn tham chiếu đối tượng của mình thông qua các giao diện (ngoại trừ HashSet mới ()) thì việc thay đổi việc triển khai đối tượng sau này là điều nhỏ nếu bạn thấy tốt hơn nên làm như vậy vì bạn chỉ đề cập đến nó một lần trong mã của mình base (nơi bạn đã tạo HashSet mới ()).
Tập hợp là một tập hợp không chứa các phần tử trùng lặp. Đặt là một giao diện.
HashSet triển khai Set
giao diện, được hỗ trợ bởi một bảng băm (thực chất là một HashMap
phiên bản).
Vì HashSet
là một trong những triển khai cụ thể của Set
giao diện.
A Set
có thể là bất kỳ phần nào sau đây vì nó được thực hiện bởi các lớp bên dưới
ConcurrentSkipListSet : Triển khai NavigableSet đồng thời có thể mở rộng dựa trên a ConcurrentSkipListMap
. Các phần tử của tập hợp được sắp xếp theo thứ tự tự nhiên của chúng hoặc theo thứ tự Comparator
được cung cấp tại thời điểm tạo tập hợp, tùy thuộc vào phương thức khởi tạo nào được sử dụng.
CopyOnWriteArraySet : Một Tập hợp sử dụng CopyOnWriteArrayList bên trong cho tất cả các hoạt động của nó.
EnumSet : Một cài đặt chuyên biệt để sử dụng với các kiểu enum. Tất cả các phần tử trong tập hợp enum phải đến từ một kiểu enum duy nhất được chỉ định, rõ ràng hoặc ngầm định, khi tập hợp được tạo.
TreeSet : Triển khai NavigableSet dựa trên Sơ đồ cây. Các phần tử được sắp xếp theo thứ tự tự nhiên của chúng hoặc bởi Bộ so sánh được cung cấp tại thời điểm tạo đã đặt, tùy thuộc vào phương thức khởi tạo nào được sử dụng.
LinkedHashSet : bảng tro và triển khai danh sách liên kết của giao diện Set, với thứ tự lặp lại có thể dự đoán được. Việc triển khai này khác với HashSet ở chỗ nó duy trì một danh sách được liên kết kép chạy qua tất cả các mục của nó.
Nhưng chỉ HashSet
có thể là LinkedHashSet
vì các LinkedHashSet
lớp conHashSet
Set là giao diện mẹ của tất cả các lớp được thiết lập như TreeSet, LinkedHashSet, v.v.
HashSet là một giao diện Set triển khai lớp.
HashSet là một lớp có nguồn gốc từ giao diện Set. Là một lớp dẫn xuất của Set, HashSet đạt được các thuộc tính của Set. Các lớp dẫn xuất quan trọng và được sử dụng thường xuyên nhất của Set là HashSet và TreeSet.
**
** Đây là một giao diện là một kiểu con của giao diện Bộ sưu tập, giống như LIST và QUEUE.
Bộ có dưới 3 lớp con, nó được sử dụng để lưu trữ nhiều đối tượng mà không bị trùng lặp.
**
**
Có thể sử dụng một giá trị NULL (vì không được phép trùng lặp), dữ liệu được lưu trữ ngẫu nhiên vì nó không duy trì trình tự.