Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Cơ chế nội bộ HashMap trong Java

Hàm hashCode dùng để lấy hash code của đối tượng trong Java. Đây là đối tượng của super class Object. Trả về tham chiếu bộ nhớ đối tượng như số nguyên. Là hàm native, nghĩa là không có phương thức Java trực tiếp lấy tham chiếu đối tượng.

Để hiệu suất HashMap tốt hơn, dùng hashCode() đúng cách. Hàm này tính bucket và index. Định nghĩa như sau:

public native hashCode()

Vì nhắc đến bucket, quan trọng hiểu ý nghĩa. Là phần tử lưu node. Có thể hơn hai node trong một bucket. Node kết nối bằng linked list. Dung lượng HashMap tính bằng bucket và load factor.

Capacity = số bucket * load factor

Hàm equals kiểm tra bằng nhau hai đối tượng. Cũng do super class Object. Hàm có thể ghi đè trong lớp tùy chỉnh bằng triển khai tùy chỉnh. Trả về true/false tùy hai đối tượng bằng nhau hay không.

Giá trị index sinh ra để kích thước mảng không lớn, tránh OutOfMemoryException. Công thức tìm index mảng:

Index = hashCode(key) & (n-1) — n là số bucket.

Hãy xem 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("Hash code cho 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("Giá trị cho key 'this': " + my_map.get(new hash_map("This"))); 
        System.out.println("Giá trị cho key 'is': " + my_map.get(new hash_map("is"))); 
        System.out.println("Giá trị cho key 'a': " + my_map.get(new hash_map("a"))); 
        System.out.println("Giá trị cho key 'sample': " + my_map.get(new hash_map("sample"))); 
    } 
}

Kết quả

Hash code cho key: This = 84 
Hash code cho key: is = 105 
Hash code cho key: a = 97 
Hash code cho key: sample = 115 
Hash code cho key: This = 84 
Giá trị cho key 'this': 15 
Hash code cho key: is = 105 
Giá trị cho key 'is': 35 
Hash code cho key: a = 97 
Giá trị cho key 'a': 26 
Hash code cho key: sample = 115 
Giá trị cho key 'sample': 45

Lớp hash_map định nghĩa string và constructor. Ghi đè bởi hashCode. Key HashMap chuyển thành int và hash code in. equals ghi đè kiểm tra key bằng key HashMap. Lớp Demo định nghĩa main instance HashMap mới tạo. Phần tử thêm bằng put và in ra console.