HashSet集合保证元素的唯一性的原理分析
p.hash 表示集合中已经存在的元素的哈希值
hash 表示要往元素中添加的元素的哈希值
p.key p表示集合中已经存在的元素(因为是双列集合所以是键值对形式,p.key是获取该键值对的键)
key 表示要往集合中添加的元素
if (p.hash == hash && ((k = p.key) == key || (key !=nul && key.equals(k)))) {
//走到这里,说明是同一个元素,不添加
}else{
//走到这里,说明不是同一个元素,就添加
}
上述的判断,具体执行流程如下:
1.比较两个对象的哈希值是否相同。 //两个对象:集合中已经存在的元素,要往集合中添加的元素
- 相同:说明两个对象可能是同一个对象,程序继续执行
- 不同:说明不是同一个元素,就添加
2.比较两个对象的地址值是否相同。
- 相同:说明是同一个元素,不添加。
- 不同:说明不是同一个元素,程序继续执行
3.判断要往集合中添加的元素是否为null
- 是:说明不是同一个元素,就添加。 //额外发现:HashSet集合可以储存null元素,HashMap集合的键也可以为null
- 否:说明可能不是同一个元素,程序继续执行
4.调用该类的equals() 方法,用来比较两个对象的各个属性值是否相同。
- 相同:说明是同一个元素,不添加
- 不同:说明不是同一个元素,添加