Ngoài thực tế là HashSet
không cho phép các giá trị trùng lặp, sự khác biệt giữa HashMap
vàHashSet
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ị.
Ngoài thực tế là HashSet
không cho phép các giá trị trùng lặp, sự khác biệt giữa HashMap
vàHashSet
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ị.
Câu trả lời:
Chúng là những cấu trúc hoàn toàn khác nhau. A HashMap
là 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 HashSet
là 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 HashSet
khô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 Collection
cho 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 đó .
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.
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
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.
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ộ và 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
Các Hashset
dụ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à: -
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.HashMap
thự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 HashSet
thự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ộ). HashSet
và HashMap
không duy trì thứ tự chèn trong khi lặp.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 .
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 đồ.
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.
A HashMap
là 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 HashSet
là 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.
equals()
phương thức của họ .
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ó).
Một Hashset được triển khai theo thuật ngữ HashMap . Đó là một ánh xạ giữa khóa và một đối tượng HIỆN TẠI.
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.
HashMap
là một Map
triể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}
HashSet
là một Set
triể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]
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.
java.util.HashSet
nói rằng được hỗ trợ bởi a java.util.HashMap
.
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.
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
HashMaps
cho 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.
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