HashMap的存储原理

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相同,对象不一定相同。

猜你喜欢

转载自www.cnblogs.com/shirley18/p/9689556.html