深入理解JavaU8国际 U8国际官方网站 体育APP下载中的HashMap的实现机制
栏目:U8体育 发布时间:2026-02-08
  u8,u8国际,u8国际官方网站,u8国际网站,u8国际网址,u8国际链接,u8体育,u8体育官网,u8体育网址,u8注册,u8体育网址,u8官方网站,u8体育APP,u8体育登录,u8体育入口   如果任何人让我描述一下HashMap的工作机制的话,我就简单的回答:“基于Hash的规则”。这句话非常简单,但是要理解这句话之前,首先

  u8,u8国际,u8国际官方网站,u8国际网站,u8国际网址,u8国际链接,u8体育,u8体育官网,u8体育网址,u8注册,u8体育网址,u8官方网站,u8体育APP,u8体育登录,u8体育入口

深入理解JavaU8国际 U8国际官方网站 U8体育APP下载中的HashMap的实现机制

  如果任何人让我描述一下HashMap的工作机制的话,我就简单的回答:“基于Hash的规则”。这句话非常简单,但是要理解这句话之前,首先我们得了解什么是哈希,不是么?

  什么是哈希哈希简单的说就是对变量/对象的属性应用某种算法后得到的一个唯一的串,用这个串来确定变量/对象的唯一性。一个正确的哈希函数必须遵守这个准则。

  当哈希函数应用在相同的对象或者equal的对象的时候,每次执行都应该返回相同的值。换句话说,两个相等的对象应该有相同的hashcode。

  注:所有Java对象都从Object类继承了一个默认的hashCode()方法。这个方法将对象在内存中的地址作为整数返回,这是一个很好的hash实现,他确保了不同的对象拥有不同的hashcode。

  关于Entry类的一点介绍一个map的定义是:一个映射键(key)到值(value)的对象。非常简单对吧。

  所以,在HashMap中一定有一定的机制来存储这些键值对。使得,HashMap有一个 内部类Entry,看起来像这样。

  当然,Entry类有属性用来存储键值对映射。key被final标记,除了key和value ,我们还能看到两个变量next和hash。接下来我们试着理解这些变量的含义。

  put()方法实际上做了什么再进一步看put方法的实现之前,我们有必要看一看Entry实例在数组中的存储, HashMap中是这样定义的:

  让我们一步一步的看首先,检查key是否为null,如果key是null值被存在table[0]的位置,因为null 的hashcode始终为0接下来,通过key的hashCode()方法计算了这个key的hash值,这个hash值被用来 计算存储Entry对象的数组中的位置。JDK的设计者假设会有一些人可能写出非常差的hashCode()方法,会出现一些 非常大或者非常小的hash值。为了解决这个问题,他们引入了另外一个hash函数,接受对象的hashCode(),并转换 到适合数组的容量大小。

  接着是indexFor(hash,table,length)方法,这个方法计算了entry对象存储 的准确位置。接下来就是主要的部分,我们都知道两个不相等的对象可能拥有过相同的 hashCode值,两个不同的对象是怎么存储在相同的位置[叫做bucket]呢?答案是LinkedList。如果你记得,Entry类有一个next变量,这个变量总是指向 链中的下一个变量,这完全符合链表的特点。

  所以,在发生碰撞的时候,entry对象会被以链表的形式存储起来,当一个Entry 对象需要被存储的时候,hashmap检查该位置是否已近有了一个entry对象,如果没有就存在那里,如果有了就检查 她的next属性,如果是空,当前的entry对象就作为已经存储的entry对象的下一个节点,依次类推。

  如果我们给已经存在的key存入另一个value会怎么样的?逻辑上,旧的值将被替 换掉。在检测了Entry对象的存储位置后,hashmap将会遍历那个位置的entry链表,对每一个entry调用equals方法 ,这个链表中的所有对象都具有相同的hashCode()而equals方法都不等。如果发现equals方法有相等的就执行替换 。

  get方法的工作机制现在我们已经了解了HashMap中存储键值对的机制。下一个问题是:怎样从一个 HashMap中查询结果。其实逻辑跟put是一样的,如果传入的key有匹配就将该位置的value返回,如果 没有就返回null.

  经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。

  写经验 有钱赚

  如要投诉,请到百度经验投诉中心,如要提出意见、建议, 请到百度经验管理吧反馈。

  ©2026Baidu京ICP证030173号-1 京网文【2023】1034-029号