HashMap为保证键的唯一性覆盖equals和hashCode的原因?

问题引导: 在学习HashMap的过程中会遇到这样的一个疑问,要保证键的唯一性,需要覆盖hashCode方法,和equals方法,那么为何为了保证键的唯一性就要哦覆盖hashCode方法,和equals方法?

 

分析过程如下: 

HashMap的处理过程:

1.每个对象都会通过hashCode()方法生成一个整形值(散列码)

2.处理散列码:

在对HashMap插入对象和查询对象时会进行以下处理:

1.HashMap会检查插入对象和查询对象的散列码是否在之前就已经存在,如果散列码不存在则在添加到HashMap中.

2.如果散列码存在则会调用equals()方法处理要插入对象和查询对象,判断插入对象和查询对象在HashMap中是否有相等的key(键),如果在HashMap中有相等的键,那么就会用新的Value替换掉老的Value,并返回老的Value

 

为何要重写eqauls()方法?

两个对象相同(即equals比较两个对象时返回true),那么它们的hashCode一定相同 hashCode相同的两个对象,它们并不一定相同(即equals比较两个对象时返回false) equals函数是所有类都会从Object类处继承的函数,当我们在HashMap中存储我们自己定义的类的时候,默认的equals函数的行为可能不能符合我们的要求,所以需要重写

不重写hashCode()方法导致的问题?

两个对象相同(即equals比较两个对象时返回true),那么它们的hashCode一定相同

hashCode相同的两个对象,它们并不一定相同(即equals比较两个对象时返回false)

如果你重写了equals,而保留hashCode的实现不变则对象对应的hashCode不一样,那么很可能会导致如下情况: 两个相等的对象A、B,hashCode却不一样,当以A作为键保存到HashMap中,以B作为键去查找A的值时,就会出现找不到的情况.(相同的键但找不到相应的值).因此要重写HashCode()方法以保证相等的对象有唯一的hashCode码。

 

 

(作者知识有限,如有不对的地方,恳请批评指正或联系我)

猜你喜欢

转载自www.cnblogs.com/abtj/p/9569720.html