Java 中 HashMap 的内部工作原理

javaobject oriented programmingprogramming

函数 ‘hashCode’ 用于获取 Java 中对象的哈希码。这是超类 Object 的对象。它以整数形式返回对象引用的内存。它是一个本机函数,这意味着 Java 中没有直接方法可用于获取对象的引用。

为了提高 HashMap 的性能,请正确使用 hashCode()。基本上,此函数用于计算存储桶和索引值。它以以下方式定义 −

public native hashCode()

既然我们提到了 ‘bucket’,那么了解它的含义就很重要了。它是用于存储节点的元素。单个存储桶中可以有两个以上的节点。可以使用链表数据结构连接节点。可以使用 bucket 和负载因子来计算 hashmap 的容量。

容量 = bucket 数量 * 负载因子

函数 ‘equals’ 用于检查两个对象之间的相等性。它也由超类 Object 提供。可以通过提供自定义实现在自定义类中重写此函数。此函数根据所讨论的两个对象是否相等返回 true 或 false。

生成索引值,以使数组的大小不大,从而避免 outOfMemoryException。查找数组索引的公式是 −

Index = hashCode(key) & (n-1) – 此处 n 表示 bucket 数量。

让我们看一个例子 −

示例

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("键 'this' 的值为 : " + my_map.get(new hash_map("This")));
      System.out.println("键 'is' 的值为 : " + my_map.get(new hash_map("is")));
      System.out.println("键 'a' 的值为: " + my_map.get(new hash_map("a")));
      System.out.println("键 'sample' 的值为: " + my_map.get(new hash_map("sample")));
   }
}

输出

键的哈希码:This = 84
键的哈希码:is = 105
键的哈希码:a = 97
键的哈希码:sample = 115
键的哈希码:This = 84
键"this"的值为:15
键的哈希码:is = 105
键"is"的值为:35
键的哈希码:a = 97
键"a"的值为:26
键的哈希码:sample = 115
键"sample"的值为:45

名为"hash_map"的类定义一个字符串和一个构造函数。它被另一个名为‘hashCode’的函数覆盖。在这里,hashmap 的键值被转换为整数,并打印哈希码。接下来,‘equals’函数被覆盖并检查键是否等于 hashmap 的键。类 Demo 定义了一个主函数,用于创建 HashMap 的新实例。使用‘put’函数将元素添加到此结构中,并在控制台上打印。


相关文章