HashSet如何保证元素的唯一性?
HashSet存储自定义对象来保证唯一性。
需求:如果两个对象的成员变量值都相同,则为同一个对象。也就是同一个元素。
String:
name,age
按照我们的想法,Set集合应该给我们去掉了重复的元素。
但事实上,这个元素还存在,这是为什么呢?
因为两个对象的成员变量值相同,这两个对象未必是同一个对象。
只不过我们的需求认为他是同一个对象。
而我们又知道要比较对象的成员变量值,就必须重写equals()。
我们重写了equals()后,并没有实现去掉重复元素。那么,为什么呢?
我们做一个简单的检测,看equals()方法有没有被执行。
通过一个简单的测试,我们发现程序并没有去执行equals(),这又是为什么呢?
看add方法的源码。
最终我们发现了罪魁祸首:
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
{
就没有添加到集合中。
}
这个判断分为左边和右边两部分:
左边:
e.hash == hash
左边比较的是哈希值,而对象的哈希值一般来说肯定不一样。
所以,左边永远是false。
所以,右边永远执行不了。
右边:
((k = e.key) == key || key.equals(k))
分为左边和右边:
左边:
//k是s1的地址值