HashSet 判断唯一性的不是两个步骤而是三个步骤
1.HashCode()
2.==
3.equals()
前面的比较会短路后面的比较 ; 也就是说 1 &&( 2||3)
底层是由Map存储数据的 , 用key 存储
下面来看一下 判断唯一性的步骤:
为了看到测试效果就没有按照规则来重写hashcode 和 equals 方法
下面的person类是用于测试的类
下面是测试代码
结果如下
就跟预想的一样,根据hashcode 和 equals 方法 来判断唯一性,但是下面来看到底有没有 == 来判断唯一性
我把 hashcode 返回固定值 1; 把equals方法永远返回 false ,如果只是根据 hashcode 和 equals 来判断唯一性的话,那么person 对象都可以装进来,可是事实却是!!
结果如下:hashset 中 依然只有一个对象,说明不只是根据 hashcode 和equals 方法来判断唯一性的,其中还经历了 用 == 来判断
总结: HashSet所谓的唯一 ,不是真正的唯一,而是取决于程序员如何定义HashCode和equals方法,当然其中还会经历 ==(对象比较是比较的地址) 的判断