当前位置: 首页 > 编程笔记 >

Java中HashMap的内部工作

贾飞章
2023-03-14
本文向大家介绍Java中HashMap的内部工作,包括了Java中HashMap的内部工作的使用技巧和注意事项,需要的朋友参考一下

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

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

public native hashCode()

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

Capacity = number of buckets * load factor

函数“等于”用于检查两个对象之间的相等性。它也是由超类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”的函数覆盖。在这里,哈希映射的键值被转换为整数,并打印出哈希码。接下来,“等于”函数被覆盖,并检查键是否等于哈希映射的键。Demo类定义一个主要函数,在该函数中创建HashMap的新实例。使用“ put”功能将元素添加到此结构中并打印在控制台上。

 类似资料:
  • 我已经完成了Java8 Hashmap的实现,并带着以下疑问来到这里。请帮我澄清一下: 我在一篇文章中读到,具有相同哈希代码的节点将被添加到与链表相同的bucket中。它说,这个链表的新节点将被添加到head而不是tail中,以避免尾部遍历。但当我看到源代码时,新的节点被添加到尾部。对吗 我没有完全理解这个变量的最小树容量。是不是经过这么多的计算,整个地图会被转换成树(从数组到树)

  • 我正在努力为下面给出的学生类编写合适的hashCode函数。 1)我认为hashCode应该足够好,这样两个不同对象的hashCode就不会相互冲突。 观察:对于这个实现,当我调试并检查“HashMap的内部表对象”类时,我发现HashMap中的每个条目都分配了不同的bucket位置。 问题:在每个索引处有一个桶(列表/树)的目的是什么。 实施: 2)如果我允许hashCode冲突: 观察:对于这

  • 我在Eclipse中获得了一个Hashmap条目,如下所示: 链接到hashmap输出的图片 我无法使用键=“value”获取值。我收到的错误是:java。lang.ClassCastException:类java。无法将lang.Double转换为java类。util。Map(java.lang.Double和java.util.Map位于加载程序“bootstrap”的模块java.base中

  • 本文向大家介绍Java HashMap的工作原理,包括了Java HashMap的工作原理的使用技巧和注意事项,需要的朋友参考一下 大部分Java开发者都在使用Map,特别是HashMap。HashMap是一种简单但强大的方式去存储和获取数据。但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.HashMap的大量源代码(包括Java 7 和Java 8),来深入理

  • 本文向大家介绍java HashMap内部实现原理详解,包括了java HashMap内部实现原理详解的使用技巧和注意事项,需要的朋友参考一下 详解HashMap内部实现原理 内部数据结构 从上面的数据结构定义可以看出,HashMap存元素的是一组键值对的链表,以什么形式存储呢 可以看出,是以数组形式储存,好的,现在我们知道,HashMap是以数组形式存储,每个数组里面是一个键值对,这个键值对还可

  • 问题内容: 假设您有一个键类(KeyClass),该键类具有重写的equals,hashCode和clone方法。假设它有2个基本字段,一个String(名称)和一个int(id)。 现在您定义 现在 因此,就HashMap而言,keyOriginal,keyCopy和keyClone是无法区分的。 现在,如果您使用keyOriginal将条目放入HashMap,则可以使用keyCopy或keyC