Java中HashMap的内部工作原理


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

为了提高HashMap的性能,请正确使用hashCode()。基本上,此函数用于计算桶和索引值。其定义如下:

public native hashCode()

既然我们提到了“桶”,那么了解它的含义很重要。它是一个用于存储节点的元素。一个桶中可以有多个节点。这些节点可以使用链表数据结构连接起来。哈希图的容量可以通过桶和加载因子计算出来。

Capacity = number of buckets * load factor

函数‘equals’用于检查两个对象之间的相等性。它也由超类Object给出。此函数可以通过提供自定义实现来在自定义类中被覆盖。此函数返回true或false,具体取决于要检查的两个对象是否相等。

生成索引值是为了避免数组的大小过大,从而避免OutOfMemoryException。查找数组索引的公式为:

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

让我们来看一个例子:

示例

 在线演示

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")));
   }
}

输出

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

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

更新于:2020年7月4日

1K+ 浏览量

开启你的职业生涯

通过完成课程获得认证

开始学习
广告