Sự khác biệt giữa Hashset và HashMap?


168

Ngoài thực tế là HashSetkhông cho phép các giá trị trùng lặp, sự khác biệt giữa HashMapHashSet gì?

Ý tôi là thực hiện khôn ngoan? Hơi mơ hồ một chút vì cả hai đều sử dụng bảng băm để lưu trữ giá trị.


HashSet được thực hiện sử dụng HashMap
therealprashant

Tôi nghĩ rằng việc biết tại sao Hashset khác với ArrayList sẽ giúp bạn hiểu câu trả lời cho câu hỏi trên của bạn: stackoverflow.com/questions/18706870/
Kẻ

Câu trả lời:


150

Chúng là những cấu trúc hoàn toàn khác nhau. A HashMaplà một thực hiện Map. Một Bản đồ bản đồ chìa khóa để các giá trị. Việc tra cứu khóa xảy ra bằng cách sử dụng hàm băm.

Mặt khác, a HashSetlà một thực hiện Set. Một tập hợp được thiết kế để phù hợp với mô hình toán học của một tập hợp. A HashSetkhông sử dụng mộtHashMap để sao lưu việc thực hiện, như bạn đã lưu ý. Tuy nhiên, nó thực hiện một giao diện hoàn toàn khác.

Khi bạn đang tìm kiếm những gì sẽ là tốt nhất Collectioncho mục đích của bạn, Hướng dẫn này là một khởi đầu tốt. Nếu bạn thực sự muốn biết những gì đang xảy ra, cũng có một cuốn sách cho điều đó .


Câu nói đó hơi đơn giản. Có một số điều nữa đang diễn ra dưới vỏ bọc, "" Trả về giá trị băm cho đối tượng được chỉ định. Ngoài mã băm riêng của đối tượng, phương thức này áp dụng "hàm băm bổ sung", bảo vệ chống lại các hàm băm chất lượng kém . Điều này rất quan trọng vì HashMap sử dụng sức mạnh của hai bảng băm có độ dài. " Weblogs.java.net/blog/2005/06/18/hashmap-im THỰCation - tuy nhiên, nếu bạn nhìn vào tài liệu, bạn sẽ thấy hàm băm này phân phối mọi thứ trên "xô", vì vậy cuối cùng tôi tin rằng hai thứ có thể được ánh xạ vào cùng một nhóm.
justkt

1
Để trả lời câu hỏi thứ hai của bạn - không. Bản đồ là nếu bạn muốn (khóa -> giá trị) như được xác định bởi câu trả lời xuất sắc của @Bruno Rothgiesser. Một bộ dành cho các yếu tố không trùng lặp. Nếu bạn muốn trùng lặp và không khóa-> giá trị, tôi sẽ kiểm tra triển khai java.util.List. Kiểm tra hướng dẫn Bộ sưu tập để có hướng dẫn dứt khoát: java.sun.com/docs/books/tutorial/collections/index.html
justkt

@justk: có, bạn có thể nhận được hai khóa trong một nhóm và sau đó bằng () được sử dụng để phân biệt giữa chúng. Đó là lý do tại sao điều cần thiết là hashCode () và equals () tương thích.
Michael Borgwardt

6
@SpikETidE: cả HashMap và Hashset đều không cho phép trùng lặp. Đó là toàn bộ vấn đề.
Michael Borgwardt

23
@SpikETidE: một bộ không có cặp khóa / giá trị, chỉ có các phần tử. Và Hashset được triển khai bằng cách có HashMap với các phần tử được đặt làm khóa và giá trị bị bỏ qua.
Michael Borgwardt

300

Hashset là một tập hợp , ví dụ {1,2,3,4,5}

HashMap là bản đồ khóa -> value (key to value), ví dụ {a -> 1, b -> 2, c -> 2, d -> 1}

Lưu ý trong ví dụ của tôi ở trên rằng trong HashMap không được có các khóa trùng lặp, nhưng nó có thể có các giá trị trùng lặp.

Trong Hashset, không được có các phần tử trùng lặp.


Nhưng lý do (thú vị nhất) cho sự nhầm lẫn là ngay cả trong Hashset, bạn cần có "chìa khóa" để truy cập các yếu tố. Tức là, các đối tượng, thậm chí trong toán học, có tên (hoặc địa chỉ), nếu chúng được truy cập hoặc tham chiếu. Vì vậy, theo nghĩa thực tế này, Hashset là một HashMap đặc biệt đơn giản, được gắn với tên (hoặc địa chỉ) của các thành phần của nó.
Andrew Marshall

65

Hashset

  1. Lớp Hashset thực hiện giao diện Set
  2. Trong Hashset, chúng tôi lưu trữ các đối tượng (phần tử hoặc giá trị), vd: Nếu chúng ta có Hashset của các phần tử chuỗi thì nó có thể mô tả một tập hợp các phần tử Hashset: {bạch Xin chào, Hồi Hi,, Tạm biệt, Tạm biệt chạy}
  3. Hashset không cho phép các phần tử trùng lặp có nghĩa là bạn không thể lưu trữ các giá trị trùng lặp trong Hashset.
  4. Hashset cho phép có một giá trị null duy nhất.
  5. Hashset không được đồng bộ hóa, điều đó có nghĩa là chúng không phù hợp với các hoạt động an toàn luồng cho đến khi trừ khi được đồng bộ hóa rõ ràng. [Tương tự]

                          add      contains next     notes
    HashSet               O(1)     O(1)     O(h/n)   h is the table 

Bản đồ băm

  1. Lớp HashMap thực hiện giao diện Bản đồ
  2. HashMap được sử dụng để lưu trữ các cặp khóa & giá trị. Nói tóm lại, nó duy trì ánh xạ của khóa & giá trị (Lớp HashMap gần tương đương với Hashtable, ngoại trừ việc nó không được đồng bộ hóa và cho phép null.) Đây là cách bạn có thể biểu diễn các phần tử HashMap nếu nó có khóa nguyên và giá trị của kiểu Chuỗi: vd: {1 -> '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '
  3. HashMap không cho phép các khóa trùng lặp tuy nhiên nó cho phép có các giá trị trùng lặp.
  4. HashMap cho phép khóa null đơn và bất kỳ số lượng giá trị null nào.
  5. HashMap không được đồng bộ hóa, điều đó có nghĩa là chúng không phù hợp với các hoạt động an toàn luồng cho đến khi trừ khi được đồng bộ hóa rõ ràng. [Tương tự]

                           get      containsKey next     Notes
     HashMap               O(1)     O(1)        O(h/n)   h is the table 

Vui lòng tham khảo bài viết này để tìm thêm thông tin.


36

Thật xấu hổ khi cả hai tên của họ bắt đầu bằng Hash . Đó là phần quan trọng nhất trong số họ. Các phần quan trọng đến sau Hash - BộBản đồ , như những phần khác đã chỉ ra. Những gì chúng là, tương ứng, là một Bộ - một bộ sưu tập không có thứ tự - và Bản đồ - một bộ sưu tập có quyền truy cập có khóa. Chúng tình cờ được thực hiện với băm - đó là nơi các tên đến từ - nhưng bản chất của chúng được ẩn đằng sau phần đó của tên của chúng.

Đừng nhầm lẫn với tên của họ; chúng là những thứ khác nhau sâu sắc


@HiteshSahu Cả hai đều được triển khai với Bảng Hash ( en.wikipedia.org/wiki/Hash_table ). Đây là một cấu trúc dữ liệu tốt để thể hiện một tập hợp, hiệu quả theo đúng cách và về cơ bản, các khóa của HashMap được triển khai dưới dạng Hashset. Vì vậy, bất cứ ai đặt tên cho họ đã gặp một số rắc rối để thực hiện chúng và tập trung vào việc thực hiện hơn là mục đích của họ (theo phỏng đoán).
Carl Manaster

1
Giải thích tốt. Cảm ơn bạn.
dùng3932000

5

Các Hashsetdụng cụ nội HashMap. Nếu bạn thấy việc triển khai bên trong, các giá trị được chèn trong Hashset được lưu dưới dạng các khóa trong HashMap và giá trị là một đối tượng Dummy của lớp Object.
Sự khác biệt giữa HashMap so với Hashset là: -

  1. HashMap chứa các cặp giá trị khóa và mỗi giá trị có thể được truy cập bằng khóa trong đó Hashset cần được lặp lại mọi lúc vì không có phương thức get.
  2. HashMapthực hiện giao diện Bản đồ và cho phép một giá trị null làm khóa và nhiều giá trị null làm giá trị. Trong khi HashSetthực hiện Giao diện cài đặt, chỉ cho phép một giá trị null và không có giá trị trùng lặp. như Hashset triển khai HashMap trong nội bộ).
  3. HashSetHashMapkhông duy trì thứ tự chèn trong khi lặp.

3

Hashset cho phép chúng ta lưu trữ các đối tượng trong tập hợp trong đó HashMap cho phép chúng ta lưu trữ các đối tượng trên cơ sở khóa và giá trị. Mỗi đối tượng hoặc đối tượng được lưu trữ sẽ có khóa.


2

Như tên gọi, HashMap là một Bản đồ kết hợp (ánh xạ từ khóa thành giá trị), Hashset chỉ là một Tập hợp .


2
@SpikETidE Đó là một chi tiết về cách thức duy nhất được triển khai, nhưng ý nghĩa của Hashset là thực hiện một bộ.
Michael Borgwardt

1
vì vậy .. tất cả tập trung vào "nếu bạn không muốn trùng lặp, hãy sử dụng hàm băm ... Nếu bạn không bận tâm về việc sao chép, hãy sử dụng HashMap" ....?
SpikETidE

3
Java không triển khai một lớp cụ thể cho "bộ sưu tập với các yếu tố có khả năng trùng lặp" ("túi"), bạn có thể sử dụng Danh sách cho việc này (mặc dù Danh sách thêm một số ngữ nghĩa vào túi: thứ tự; nhưng bạn có thể bỏ qua điều này).
leonbloy

2

Sự khác biệt giữa Hashset và HashMap trong Java

1) Sự khác biệt đầu tiên và quan trọng nhất giữa HashMap và Hashset là HashMap là một triển khai của giao diện Map trong khi Hashset là một triển khai của giao diện Set, có nghĩa là HashMap là một cấu trúc dữ liệu dựa trên giá trị chính và Hashset đảm bảo tính duy nhất bằng cách không cho phép trùng lặp. thực tế Hashset là một trình bao bọc xung quanh HashMap trong Java, nếu bạn nhìn vào mã của phương thức add (E e) của HashSet.java, bạn sẽ thấy đoạn mã sau:

public boolean add(E e) 
{
    return map.put(e, PRESENT)==null;
}

trong đó việc đưa Object vào bản đồ làm chìa khóa và giá trị là một đối tượng cuối cùng HIỆN TẠI.

2) Sự khác biệt thứ hai giữa HashMap và Hashset là, chúng tôi sử dụng phương thức add () để đặt các phần tử vào Set nhưng chúng tôi sử dụng phương thức put () để chèn khóa và giá trị vào HashMap trong Java.

3) Hashset chỉ cho phép một khóa null, nhưng HashMap có thể cho phép một khóa null + nhiều giá trị null.

Đó là tất cả về sự khác biệt giữa Hashset và HashMap trong Java. Tóm lại Hashset và HashMap là hai loại Bộ sưu tập khác nhau được đặt và một loại khác là Bản đồ.


2

Sự khác biệt giữa Hashset và HashMap trong Java

Hashset sử dụng nội bộ HashMap để lưu trữ các đối tượng. Khi phương thức add (String) được gọi là phương thức HahsMap put (key, value) trong đó key = String object & value = new Object (Dummy). Vì vậy, nó không duy trì trùng lặp vì các khóa không là gì ngoài Giá trị Vật.

các Đối tượng được lưu trữ dưới dạng khóa trong Hashset / HashMap sẽ ghi đè mã băm & bằng với hợp đồng.

Các khóa được sử dụng để truy cập / lưu trữ các đối tượng giá trị trong HashMap sẽ được khai báo là Final vì khi nó được sửa đổi, đối tượng Giá trị không thể được định vị & trả về null.


1

A HashMaplà thêm, nhận, xóa, ... các đối tượng được lập chỉ mục bởi một khóa tùy chỉnh thuộc bất kỳ loại nào.
A HashSetlà thêm các phần tử, loại bỏ các phần tử và kiểm tra xem các phần tử có mặt hay không bằng cách so sánh các giá trị băm của chúng.

Vì vậy, HashMap chứa các phần tử và Hashset ghi nhớ các giá trị băm của chúng.


1
Bằng cách so sánh băm của họ và gọi equals()phương thức của họ .
Hầu tước Lorne

1

Sự khác biệt: liên quan đến quyền thừa kế: Hashset thực hiện Set. HashMap thực hiện Bản đồ và lưu trữ ánh xạ các khóa và giá trị.

Việc sử dụng Hashset và HashMap đối với cơ sở dữ liệu sẽ giúp bạn hiểu được tầm quan trọng của từng loại.
Hashset: thường được sử dụng để lưu trữ các đối tượng bộ sưu tập duy nhất. Ví dụ: Nó có thể được sử dụng làm lớp triển khai để lưu trữ tàu quan hệ nhiều-một giữa Vật phẩm
lớp và Giá thầu lớp trong đó ( Vật phẩm có nhiều Giá thầu) HashMap: được sử dụng để ánh xạ khóa tới value. Giá trị có thể là null hoặc bất kỳ Đối tượng nào / list of Object (vốn là đối tượng trong chính nó).



0

Hashset sử dụng HashMap bên trong để lưu trữ các mục nhập của nó. Mỗi mục trong HashMap nội bộ được khóa bởi một Đối tượng duy nhất, vì vậy tất cả các mục nhập băm vào cùng một nhóm. Tôi không nhớ những gì HashMap nội bộ sử dụng để lưu trữ các giá trị của nó, nhưng nó không thực sự quan trọng vì bộ chứa bên trong sẽ không bao giờ chứa các giá trị trùng lặp.

EDIT : Để giải quyết bình luận của Matthew, anh ấy đúng; Tôi đã có nó ngược. HashMap bên trong được khóa với các Đối tượng tạo thành các phần tử Set . Các giá trị của HashMap là một Đối tượng chỉ được lưu trữ đơn giản trong các thùng HashMap.


Điều đó không đúng. Các phần tử thiết lập được sử dụng trực tiếp làm khóa HashMap.
Matthew Flaschen

0

HashMaplà một Maptriển khai, cho phép các giá trị trùng lặp nhưng không trùng lặp các khóa. . Để thêm một đối tượng, một cặp Khóa / Giá trị là bắt buộc. Khóa Null và giá trị Null được cho phép. ví dụ:

{The-> 3, world-> 5, is-> 2, đẹp-> 4}

HashSetlà một Settriển khai, không cho phép trùng lặp . Nếu bạn đã cố gắng thêm một đối tượng trùng lặp, một cuộc gọi đến public boolean add(Object o)phương thức, thì tập hợp không thay đổi và trả vềfalse . ví dụ:

[Thế giới, là, tốt đẹp]


-1

bạn đã trả lời khá nhiều câu hỏi của riêng bạn - hashset không cho phép các giá trị trùng lặp. việc xây dựng một bộ băm bằng cách sử dụng một hashmap sao lưu sẽ là chuyện nhỏ (và chỉ cần kiểm tra xem giá trị đã tồn tại chưa). Tôi đoán các triển khai java khác nhau hoặc làm điều đó hoặc thực hiện một số mã tùy chỉnh để làm điều đó hiệu quả hơn.


1
@oedo - java.util.HashSetnói rằng được hỗ trợ bởi a java.util.HashMap.
justkt

2
Không cho phép trùng lặp không phải là một sự khác biệt giữa chúng.
Hầu tước Lorne

-1

Về cơ bản trong HashMap, người dùng phải cung cấp cả Khóa và Giá trị, trong khi trong Hashset bạn chỉ cung cấp Giá trị, Khóa được lấy tự động từ Giá trị bằng cách sử dụng hàm băm. Vì vậy, sau khi có cả Khóa và Giá trị, Hashset có thể được lưu trữ dưới dạng HashMap bên trong.


Chìa khóa giá trị trong Hashset.
Hầu tước Lorne

-1

Cả Hashset và HashMap đều lưu trữ các cặp, sự khác biệt nằm ở HashMap, bạn có thể chỉ định một khóa trong khi trong Hashset, khóa đến từ mã băm của đối tượng


Nếu đó là sự thật, Hashset không thể lưu trữ nhiều đối tượng có cùng mã băm và nó cũng vậy.
Hầu tước Lorne

-1

HashMapscho phép một khóa null và giá trị null. Chúng không được đồng bộ hóa, làm tăng hiệu quả. Nếu được yêu cầu, bạn có thể làm cho chúng được đồng bộ hóa bằng cách sử dụngCollections.SynchronizedMap()

Hashtables không cho phép các khóa null và được đồng bộ hóa.


Anh ta không hỏi Hashtables. Không trả lời câu hỏi.
Hầu tước Lorne

-2

HashMap là một triển khai của giao diện Bản đồ Hashset là một triển khai của Set Interface

HashMap Lưu trữ dữ liệu dưới dạng cặp giá trị khóa

Đặt phương thức được sử dụng để thêm phần tử trong bản đồ Thêm phương thức được sử dụng để thêm phần tử là Set

Trong giá trị băm, giá trị mã băm được tính bằng đối tượng khóa Ở đây, đối tượng thành viên được sử dụng để tính giá trị mã băm có thể giống nhau cho hai đối tượng nên phương thức () được sử dụng để kiểm tra sự bằng nhau nếu nó trả về sai có nghĩa là hai đối tượng khác nhau.

HashMap nhanh hơn hashset vì khóa duy nhất được sử dụng để truy cập đối tượng Hashset chậm hơn Hashmap


1
Chúng có hiệu suất cơ bản giống hệt nhau và 'bởi vì khóa duy nhất được sử dụng' là không chính xác.
Hầu tước Lorne
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.