× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

So sánh HashMap và Hashset trong Java

19/11/2021 13:21

Hashmap và HashSet là hai trong số các lớp Collection quan trọng nhất trong Java. Chúng nằm trong gói java.util. Chúng ta sử dụng cả hai để phục vụ các mục đích khác nhau của cấu trúc dữ liệu. Chủ đề này là một trong những câu hỏi quan trọng trong những cuộc phỏng vấn về Java. Do đó, bạn phải biết kỹ lưỡng về chúng và sự khác biệt giữa chúng. Cùng tìm hiểu về Hashmap và HashSet trong Java ngay trong bài viết dưới đây.

 HashMap và Hashset trong Java

HashSet trong Java là gì?

Hashset là một collection framework thực hiện giao diện Set và không cho phép nhân bản bất kỳ giá trị nào. Tất cả các đối tượng lưu trữ trong HashSet phải ghi đè phương thức equals() và hashCode() để chúng ta có thể kiểm tra giá trị nhân bản. HashSet không phả là luồng an toàn và không được đồng bộ hóa. Có một phương thức Add() thêm yếu tố trong HashSet.

Cú pháp của phương thức này là:

public boolean add(Object obj)

Phương thức này trả lại giá trị boolean. Nó trả lại kết quả true nếu là phần tử là độc nhất và thêm phần tử thành công, trả về giá trị false nếu có một giá trị trùng lặp được thêm vào HashSet.

Ví dụ:

HashSet vehicleSet = new HashSet();

vehicleSet.add(“Car”);

vehicleSet.add(“Motorcycle”);

vehicleSet.add(“Bus”);

Hashmap trong Java là gì

Hashmap là một bảng Hash thực hiện giao diện Map và ánh xạ một khóa đến giá trị. HashMap cũng không cho phép các khóa trùng lặp nhưng cho phép các giá trị trùng lặp trong đó. Giao diện Map có hai lớp triển khai là TreeMap duy trì thứ tự của các đối tượng. HashMap không an toàn theo chuỗi và không được đồng bộ hóa. Nó không cho phép các giá trị trùng lặp nhưng nó cho phép các giá trị rỗng. Để thêm các phần tử trong Hashmap, phương thức put() chấp nhận một khóa và một giá trị.

Cú pháp của nó là:

 

public Object put(Object key, Object value)

Ví dụ:



HashMap<Integer, String> vehicleHashMap = new HashMap<Integer, String>();

vehicleHashMAp.put( 1, “Car” );

vehicleHashMAp.put( 2, “Motorcycle” );

vehicleHashMAp.put( 3, “Bus” );

>>> Đọc thêm: Giới thiệu Design Pattern trong Java và tìm hiểu các loại Design Pattern

 

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

Chúng ta sẽ thảo luận sự khác biệt với một tham số cụ thể

Triển khai hệ thống phân cấp

HashSet triển khai giao diện Set của Java trong khi HashMap thực hiện giao diện Map. Giao diện Set mở rộng giao diện Collection là giao diện cấp cao nhất của Collection framework trong Java, trong khi giao diện Map không mở rộng bất kỳ giao diện nào.

Cách lưu trữ dữ liệu của HashMap và HashSet trong Java

HashSet lưu trữ dữ liệu dưới dạng các đối tượng, trong khi HashMap lưu trữ dữ liệu dưới dạng các cặp khóa - giá trị. Trong HashMap, chúng ta có thể truy xuất từng giá trị bằng cách sử dụng khóa. 

Ví dụ:

HashSet<String> hs = new HashSet<String>();

hs.add(“Java”);

HashMap<Integer, String> hm = new HashMap<Integer, String>();

hm.put(1, “Java”);

>>> Tham khảo: Khóa học lập trình Java

Nhân bản giá trị trong Hashmap và HashSet trong Java

HashSet không cho phép bạn thêm các giá trị trùng lặp. Nhưng hashmap lưu trữ các cặp khóa - giá trị và cho phép các khóa trùng lặp nhưng không trùng lặp giá trị. Nếu chúng ta thêm khóa trùng lặp, thì khóa đó sẽ sử dụng giá trị mới với khóa đó.

Giá trị rỗng - Null trong  Hashmap và HashSet trong Java

HashSet cho phép một giá trị null sau khi thêm giá trị null, HashSet không cho phép thêm nhiều giá trị null. Mặt khác, HashMap cho phép nhiều giá trị null nhưng chỉ có một khóa Null.

Phương thức chèn phần tử HashMap và HashSet trong Java

Có các phương thức được xác định trước cho cả HashSet và HashMap để lưu trữ hoặc thêm các phần tử. Phương thức add() thêm các phần tử trong HashSet trong khi phương thức put() thêm hoặc lưu trữ các phần tử trong một HashMap. Trong khi sử dụng phương thức add, chúng ta truyền trực tiếp giá trị dưới dạng một đối tượng. Nhưng khi sử dụng phương thức put (), chúng ta cần truyền khóa cũng như giá trị để thêm phần tử trong một HashSet. 

 

>>> Đọc thêm: Khám phá cách tránh lỗi ConcurrentModificationException trong Java

 

Hiệu suất của HashMap và HashSet trong Java

Tốc độ của HashSet chậm hơn HashMap. Lý do mà HashMap nhanh hơn HashSet là HashMap sử dụng các khóa duy nhất để truy cập các giá trị. Nó lưu trữ mỗi giá trị bằng một khóa tương ứng và chúng ta có thể truy xuất các giá trị này nhanh hơn bằng cách sử dụng khóa trong trình lặp. Trong khi HashSet hoàn toàn dựa trên các đối tượng và do đó việc truy xuất giá trị chậm hơn. 

Bảng so sánh HashSet và HashMap trong Java 

 

Tham số

HashSet

HashMap

Thực thi

Giao diện set

Giao diện Map

Lưu trữ

Các đối tượng

Các cặp khóa - giá trị

Nhân bản giá trị

HashSet không cho phép các giá trị trùng lặp

HashMap cho phép các khóa trùng lặp nhưng không cho phép các giá trị trùng lặp

Giá trị Null

Cho phép một giá trị Null

Cho phép một khóa null nhưng nhiều giá trị null

Phương thức chèn phần tử

Chúng ta sử dụng phương thức add() để chèn các phần tử trong HashSet

Chúng ta sử dụng phương thức put  () để chèn các phần từ trong HashMap

Số đối tượng

Chúng ta chỉ có thể tạo một đối tượng trong quá trình thêm các phần tử

Chúng ta tạo hai đối tượng trong quá trình thêm các đối tượng

Hiệu suất

Chậm hơn

Nhanh hơn

Cách dùng

Sử dụng HashSet để duy trì tính duy nhất của dữ liệu

Sử dụng HashMap là khi tính duy nhất của dữ liệu không con nhiều quan trọng

 

Khi nào sử dụng HashSet và HashMap trong Java

Chúng ta nên sử dụng HashSet hơn là HashMap khi chúng ta muốn duy trì tính duy nhất trong đối tượng Collection. Trong tất cả các trường hợp  khác, chúng ta nên sử dụng HashMap thay thì HashSet vì hiệu suất của  nó tốt hơn HashSet.

Kết  luận:

Trong bài viết này, chúng ta đã thảo luận về mọi sự khác biệt giữa HashSet và HashMap. Chúng ta sử dụng cả hai như một lớp Collection trong Java. HashSet triển khai giao diện set và hoạt động nội bộ nhớ HashMap trong khi HashMap triển khai giao diện Bản đồ. Trên đây là một số so sánh Hashmap với HashSet trong Java, hy vọng đã hiểu rõ hơn về cả hai phương thức. Tìm hiểu thêm về Java và các ngôn ngữ lập trình khác qua các khóa học lập trình tại T3H.