2、HashSet 是如何保证不重复的

2018-12-17  本文已影响0人  Jeffery大侠

1:看一下add方法:

使用的是HashMap类中的put方法,map中的value是常量

2:思考一个问题,如果存入的值是int,或者一些基础类型,是很好理解的,这个不可重复其实是新的value代替了旧的value,只不是新旧value是一样的(PRESENT);

但是,如果存入的是一个对象呢,怎么保证其不重复呢????那我们看一下map中的put方法吧。

3:源码如下:

a:对key的hashCode进行hash,计算出应该在的位置index,

b:取出map中这个位置的元素e,e可能是一个链表(详情看程序员小灰HashMap的介绍),对这个位置的链表进行循环;

c:如果hash码值不相同,说明是一个新元素,存;

d: 如果hash码值相同,且equles判断相等,说明元素已经存在,不存;

e:如果hash码值相同,且equles判断不相等,说明元素不存在,存;

所以,判断两个对象是不是重复的,主要依靠的是hashCode方法和equals方法,所以,一个对象如果想通过HashSet方法判断是不是重复的,需要重写hashCode方法和equals方法

例如:

如:新建一个Person对象,重写hashCode方法

可以看出,Person对象内两个参数name,age,hash码值是这两者计算后的记过,那么完全有可能两个对象name,age都不同,hash码值相同;

下面看下equles()方法:

参考文章:https://blog.csdn.net/u010698072/article/details/52802179

https://www.cnblogs.com/nickhan/p/8550655.html

上一篇下一篇

猜你喜欢

热点阅读