Computer >> Máy Tính >  >> Lập trình >> Java

Hoạt động nội bộ của HashMap trong Java

Hàm ‘hashCode’ được sử dụng để lấy mã băm của một đối tượng trong Java. Đây là một đối tượng của siêu lớp Object. Nó trả về bộ nhớ của tham chiếu đối tượng dưới dạng số nguyên. Đây là một hàm gốc, có nghĩa là không có phương thức trực tiếp nào trong Java có thể được sử dụng để tìm nạp tham chiếu của đối tượng.

Để HashMap hoạt động tốt hơn, hãy sử dụng hashCode () đúng cách. Về cơ bản, hàm này được sử dụng để tính toán giá trị nhóm và chỉ số. Nó được định nghĩa theo cách sau -

public native hashCode()

Vì chúng tôi đã đề cập đến "bucket", điều quan trọng là phải hiểu ý nghĩa của nó. Nó là một phần tử được sử dụng để lưu trữ các nút. Có thể có nhiều hơn hai nút trong một nhóm. Các nút có thể được kết nối bằng cách sử dụng cấu trúc dữ liệu danh sách liên kết. Dung lượng của bản đồ băm có thể được tính toán bằng cách sử dụng hệ số tải trọng và nhóm.

Capacity = number of buckets * load factor

Hàm ‘equals’ được sử dụng để kiểm tra sự bằng nhau giữa hai đối tượng. Nó cũng được đưa ra bởi siêu lớp Object. Chức năng này có thể được ghi đè trong lớp tùy chỉnh bằng cách cung cấp triển khai tùy chỉnh. Hàm này trả về true hoặc false tùy thuộc vào việc hai đối tượng trong câu hỏi có bằng nhau hay không.

Giá trị chỉ mục được tạo để kích thước của mảng không lớn, do đó tránh outOfMemoryException. Công thức để tìm chỉ số của mảng là -

Index = hashCode(key) & (n-1) – Here n refers to number of buckets.

Hãy để chúng tôi xem một ví dụ -

Ví dụ

import java.util.HashMap;
class hash_map{
   String key;
   hash_map(String key){
      this.key = key;
   }
   @Override
   public int hashCode(){
      int hash = (int)key.charAt(0);
      System.out.println("The hash code for key : " + key + " = " + hash);
      return hash;
   }
   @Override
   public boolean equals(Object obj){
      return key.equals(((hash_map)obj).key);
   }
}
public class Demo{
   public static void main(String[] args){
      HashMap my_map = new HashMap();
      my_map.put(new hash_map("This"), 15);
      my_map.put(new hash_map("is"), 35);
      my_map.put(new hash_map("a"), 26);
      my_map.put(new hash_map("sample"), 45);
      System.out.println("The value for key 'this' is : " + my_map.get(new hash_map("This")));
      System.out.println("The value for key 'is' is: " + my_map.get(new hash_map("is")));
      System.out.println("The value for key 'a' is: " + my_map.get(new hash_map("a")));
      System.out.println("The value for key 'sample' is: " + my_map.get(new hash_map("sample")));
   }
}

Đầu ra

The hash code for key : This = 84
The hash code for key : is = 105
The hash code for key : a = 97
The hash code for key : sample = 115
The hash code for key : This = 84
The value for key 'this' is : 15
The hash code for key : is = 105
The value for key 'is' is: 35
The hash code for key : a = 97
The value for key 'a' is: 26
The hash code for key : sample = 115
The value for key 'sample' is: 45

Một lớp có tên ‘hash_map’ định nghĩa một chuỗi và một phương thức khởi tạo. Điều này bị ghi đè bởi một hàm khác có tên là 'hashCode'. Tại đây, các giá trị chính của hashmap được chuyển đổi thành số nguyên và mã băm được in. Tiếp theo, hàm ‘bằng’ được ghi đè và kiểm tra xem khóa có bằng khóa của bản đồ băm hay không. Lớp Demo định nghĩa một chức năng chính nơi một phiên bản HashMap mới được tạo. Các phần tử được thêm vào cấu trúc này bằng cách sử dụng hàm 'put' và được in trên bảng điều khiển.