Khi bạn học một ngôn ngữ máy tính mới, một trong những điều đầu tiên bạn có xu hướng hỏi là làm thế nào để làm việc với các nhóm dữ liệu lớn. Chủ đề này thường được đề cập trong chủ đề Cấu trúc dữ liệu trực tuyến. Nếu bạn đào sâu hơn, bạn phải xoay quanh các chủ đề như danh sách được liên kết, hàng đợi, ngăn xếp và cây nhị phân trong số nhiều cấu trúc dữ liệu khác. Trong Java, các cấu trúc này là một phần của Khung sưu tập Java. Một bộ sưu tập không là gì ngoài một kiểu cấu trúc dữ liệu đề cập đến một nhóm nhiều yếu tố dữ liệu và Khung công tác bộ sưu tập Java chuẩn hóa cách thức xử lý các nhóm đối tượng này. Trên thực tế, khung bộ sưu tập được thiết kế để đáp ứng một số mục tiêu.
Toàn bộ khung bộ sưu tập được thiết kế xung quanh một bộ giao diện tiêu chuẩn. Một số triển khai tiêu chuẩn như LinkedList, Hashset và Treeset được cung cấp bởi các giao diện mà bạn có thể như hiện tại. Ngoài ra, bạn cũng có thể thực hiện bộ sưu tập của riêng mình nếu bạn chọn. Tuy nhiên, ngoài các bộ sưu tập, khung công tác xác định một số giao diện và lớp bản đồ. Java chứa ba triển khai bản đồ có mục đích chung - HashMap, TreeMap và LinkedHashMap - nơi lưu trữ các cặp khóa / giá trị. Mặc dù bản đồ không phải là bộ sưu tập về mặt kỹ thuật, nhưng chúng được tích hợp đầy đủ với các bộ sưu tập. Trong thực tế, bản đồ tập trung vào các nhóm liên kết giữa các đối tượng. Bài viết này tóm tắt sự khác biệt chính giữa HashMap và Hashset.
HashMap là triển khai được sử dụng phổ biến nhất của giao diện Bản đồ, cung cấp bản đồ khóa / giá trị cơ bản trong đó các phần tử không được sắp xếp. Nó sử dụng một giá trị đặc biệt gọi là mã băm, thay vì tìm kiếm khóa chậm. Mã băm là một cách để lấy thông tin trong đối tượng được đề cập và biến nó thành một int int int tương đối độc đáo cho đối tượng đó. Nó chỉ đơn giản hoạt động trên nguyên tắc băm có nghĩa là nó sử dụng hàm băm để ánh xạ các giá trị xác định. Giống như Vector và Stack có sự thay thế của chúng trong ArrayList và LinkedList, Hashtable có sự thay thế trong HashMap. Nó mở rộng AbstractMap để thực hiện giao diện Map bằng cách sử dụng biểu diễn Hashtable bên trong. Và tương tự như các triển khai cho mục đích chung khác, HashMap hỗ trợ các phương thức Map tùy chọn, cho phép các giá trị null và không được đồng bộ hóa.
Hashset là một trong những thành viên của Khung công tác bộ sưu tập Java, thực hiện giao diện Set, được hỗ trợ bởi một bảng băm trong thực tế là một cá thể HashMap. Như tên của nó, nó được thực hiện bởi một bảng băm, một mảng trong đó các phần tử được lưu trữ tại một vị trí xuất phát từ nội dung của chúng. Không giống như Bản đồ, Set chính xác là Bộ sưu tập có cùng giao diện, do đó không có bất kỳ chức năng bổ sung nào giống như có hai Danh sách khác nhau. Hashset sử dụng chức năng băm được thiết kế đặc biệt để tra cứu nhanh. Nó là một bộ sưu tập các đối tượng duy nhất không có thứ tự không thể lưu trữ các giá trị trùng lặp. Hashset mở rộng lớp Tóm tắt, cài đặt giao diện Set. Tuy nhiên, HashSet không định nghĩa bất kỳ phương thức bổ sung nào ngoài các phương thức được cung cấp bởi siêu lớp và giao diện của nó.
HashMap là triển khai được sử dụng phổ biến nhất của giao diện Bản đồ, cung cấp bản đồ khóa / giá trị cơ bản trong đó các phần tử không được sắp xếp. Nó chỉ đơn giản hoạt động trên nguyên tắc băm có nghĩa là nó sử dụng hàm băm để ánh xạ các giá trị xác định. Mặt khác, Hashset là một trong những thành viên của Khung công tác Bộ sưu tập Java thực hiện giao diện Set, được hỗ trợ bởi một bảng băm trong thực tế là một cá thể HashMap. Nói một cách đơn giản, HashMap thực hiện giao diện Bản đồ, trong khi Hashset thực hiện giao diện Set.
Hashset tạo ra một bộ sưu tập sử dụng bảng băm để lưu trữ. Bảng băm lưu trữ thông tin bằng phương pháp gọi là băm. Hashset sử dụng chức năng băm, được thiết kế đặc biệt để tra cứu nhanh, để lưu trữ các yếu tố hoặc giá trị. Hầu hết các chức năng của Hashset được cung cấp thông qua siêu lớp Tóm tắt Tóm tắt và Tóm tắt, mà Hashset chia sẻ với Treeset. HashMap mở rộng Tóm tắt Bản đồ để triển khai giao diện Bản đồ bằng cách sử dụng biểu diễn Hashtable bên trong. Cả hai lớp không được đồng bộ hóa có nghĩa là chúng không phù hợp cho các hoạt động an toàn luồng.
Vì Map không hỗ trợ các khóa trùng lặp, HashMap không cho phép các khóa trùng lặp nhưng nó được phép có các giá trị trùng lặp. Điều này có nghĩa là các giá trị trùng lặp có thể tồn tại trong HashMap nhưng bạn có thể sử dụng bộ sưu tập làm giá trị đối với một số khóa. Mỗi khóa phải là duy nhất trong HashMap và một khóa duy nhất không thể được phép có nhiều hơn 1 giá trị. Mặt khác, Hashset không thể có các phần tử trùng lặp theo định nghĩa đơn thuần của Tập hợp, có nghĩa là bạn không thể lưu trữ các giá trị trùng lặp trong Hashset. HashMap chỉ cho phép một khóa null nhưng cho phép bất kỳ số lượng giá trị null nào, trong khi Hashset chỉ cho phép một giá trị null.
HashMap hoạt động theo nguyên tắc băm, có nghĩa là nó sử dụng hàm băm để ánh xạ xác định các giá trị bên trong bằng thuật toán băm để cho phép truy xuất dễ dàng. Một cơ chế băm thực sự luôn trả về cùng một hashCode () khi được áp dụng cho cùng một đối tượng. Mặt khác, Hashset sử dụng HashMap làm cấu trúc dữ liệu sao lưu để thêm hoặc lưu trữ các đối tượng. Điều này có nghĩa là khi một đối tượng của Hashset được tạo, nó sẽ tạo một đối tượng của HashMap.
Mặc dù cả HashMap và Hashset đều không được đồng bộ hóa, chúng không phù hợp với các hoạt động an toàn luồng và chúng là các cấu trúc hoàn toàn khác nhau, chúng cung cấp hiệu suất thời gian không đổi cho các hoạt động cơ bản như thêm, xóa phần tử, v.v. Trong khi HashMap là một triển khai mục đích chung của giao diện Map lưu trữ các cặp khóa / giá trị, Hashset là một triển khai của giao diện Set. Hashset sử dụng HashMap để sao lưu việc thực hiện. Tuy nhiên, HashMap sử dụng nguyên tắc băm và sử dụng nó để nhanh chóng tìm kiếm khóa.