码迷,mamicode.com
首页 > 其他好文 > 详细

HashMap的存储原理

时间:2018-09-22 12:27:09      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:创建   重写   通过   不可变类   list   equals   说明   key   关系   

H ashMap是<key, value>,不能用来存储重复的键

1、调用key的hashCode()方法生成一个hash值h1,如果这个h1在haspMap中不存在,那么直接将<key, value>值存进去。

2、如果h1已经存在,那么找到HashMap中所有hash值为h1的key,然后分别调用key的equals()方法判断当前添加的key值是否与已经存在的key值相同。

     2.1、如果equals()返回的是true,说明key相同,说明key值已经存在,那么会用新的value值覆盖旧的value值

     2.2、如果equals()返回的是false,说明key在hashMap里不存在,因此会在HashMap中创建新的映射关系。  这种情况会产生冲突。采用链地址法来解决冲突。

       

查找的过程:具体:从HashMap中通过key查找value时,首先调用key的hashCode()方法来获取key的hash值h,那么这样可以确定键为key的所有值得首地址(keyList)。如果h对应的key值有多个,那么程序会遍历所有的key,通过调用所有的key的equals()方法来判断key的内容是否相等。只有当equals()方法的返回值为true时,对应的value才是正确的结果。

 

Object类默认的hashCode()方法和equals()方法的比较规则如下:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false。hashCode()方法会返回对象存储的内存地址。

因此,如果想根据对象的相关属性来定义对象是否相同的逻辑,就需要重写equals方法,一旦重写了equals方法,那么必须重写hashcode方法。

          当定义类作为hashMap的key时,最好把这个类定义为不可变类。。

          如果两个对象相等,那么这两个对象有相同的hashcode,但是hashcode相同,对象不一定相同。

HashMap的存储原理

标签:创建   重写   通过   不可变类   list   equals   说明   key   关系   

原文地址:https://www.cnblogs.com/shirley18/p/9689556.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!