先看代码如下 看看各位对于四个print输出的结果是否存有疑惑
public void test() {
Set set = new HashSet();
Person p1=new Person("a",1);
Person p2=new Person("b",2);
set.add(p1);
set.add(p2);
System.out.println(set);
p1.setName("c");
set.remove(p1);
System.out.println(set);
set.add(new Person("c",1));
System.out.println(set);
set.add(new Person("a",1));
System.out.println(set);
}
分析这道题时 我们首先需要明白的是 HashSet的存储当时,它实现通过对象的hashCode方法找到存储的位置后再根据对象的equals方法来尽心内容的比较(所以HashSet存储的是同一类对象)
首先 第一个print想必给我一定都明白(记得重写对象的toString方法),然后分析第二个print为什么还是两个对象呢?不是已经删除了一个吗?
这是因为我们在删除p1前对p1的name进行了改变,所以在进行set.remove(p1);操作时,会先调用hashCode方法找到p1对象所在的位置(hashCode的值是根据对象的属性值来确定的,想了解详情的小伙伴可以去看看重写的HashCode代码哦),因为对象的属性内容发生了变化,hash值也就有了变化,找的位置也就不一样,所以对于原p1对象没有影响.
接下来我们看第三个print输出,此时的set又进行了add操作,此时你可能又有疑惑了,怎么添加了两个属性内容一样的对象呢,set不是添加不可重复的吗, 这里的原因是我们在进行添加时是按照new Person("c",1)的hashCode值进行存储的,而p1是按照new Person("a",1)的hashCode值进行存储的,他还在原来的为位置,只是他的name属性进行了改变。
第四个print 小伙伴们应该都清楚了吧(注意我开始时说的话),我就不讲了,大家思考一下吧。