Sự khác biệt giữa HashSet và Set là gì?


83

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?


8
Bạn có thể muốn xem khái niệm về giao diện
Nikita Rybak

Câu trả lời:


101

A Setđại diện cho một "bộ giá trị" chung. A TreeSetlà tập hợp mà các phần tử được sắp xếp (và do đó có thứ tự), a HashSetlà tập hợp mà các phần tử không được sắp xếp hoặc có thứ tự.

A HashSetthường nhanh hơn rất nhiều so với a TreeSet.

A TreeSetthườ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 HashSetsử 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 HashSetphạ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).


Ngoài ra, có những triển khai cho mục đích chung này: LinkedHashSet (một biến thể của HashSet giữ một số thứ tự cho Iterator), ConcurrentSkipListSet (một triển khai SortedSet theo chủ đề), CopyOnWriteArraySet (một biến thể an toàn cho luồng được tối ưu hóa cho "nhiều lượt đọc, rất hiếm khi write "), EnumSet (chỉ hoạt động trên các kiểu enum cho các phần tử, nhưng sau đó thậm chí còn nhanh hơn HashSet).
Paŭlo Ebermann

7
@Erik: Tôi yêu cầu chỉnh sửa câu trả lời của bạn. TreeSet được sắp xếp không theo thứ tự. HashSet = Không có thứ tự, TreeSet = đã sắp xếp, LinkedHashSet = có thứ tự. Vui lòng sửa đổi câu trả lời của bạn cho phù hợp
Rais Alam

Hashset có thể chậm hơn nếu thực hiện hashCode là xấu (ví dụ luôn trả lại hashcode cùng)
Romain hautefeuille

35

Đây HashSetlà một triển khai của a Set.


14
Tôi không hiểu nhận xét này. Câu hỏi là "sự khác biệt là gì" chứ không phải "mối quan hệ giữa là gì".
jambox

8
Ông giải thích sự khác biệt, Set là giao diện, HashSet là phần thực thi của giao diện đó. Do đó, chúng không phải là các triển khai khác nhau, đơn giản HashSet là một trong những triển khai của Set (triển khai khác là TreeSet).
AggieDev

Nghe có vẻ như một câu trả lời hợp lệ đối với tôi
Romain hautefeuille

3
Để lại cho bạn một phiếu tán thành vì bạn đã không trả lời câu hỏi nào cả. Trong tương lai, tôi khuyên bạn nên thêm một số tài liệu, ví dụ và so sánh. Chỉ viết một câu duy nhất và hầu hết nội dung chỉ là liên kết đến nơi khác KHÔNG phải là cách bạn trả lời câu hỏi trên Stack Overflow.
Urda

Câu hỏi này đã được trả lời, 6 năm trước, (xem ở trên) nhưng cảm ơn bạn.
vaugham

16

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 ()).


14

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 Setgiao diện, được hỗ trợ bởi một bảng băm (thực chất là một HashMapphiên bản).

HashSetlà một trong những triển khai cụ thể của Setgiao diện.

A Setcó 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ỉ HashSetcó thể là LinkedHashSetvì các LinkedHashSetlớp conHashSet


8

Set là giao diện chung cho một tập hợp giống như set, trong khi HashSet là một triển khai cụ thể của giao diện Set (sử dụng mã băm, do đó có tên).


2

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.


0

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.


-1

**

  • Bộ:

** Đâ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.

  1. HashSet
  2. LinkedHashSet
  3. TreeSet (triển khai giao diện SortedSet)

**

  • HashSet:

**

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ự.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.