写一个Person类,有name和id两个属性,并且实现了hashCode和equals方法,请写出测试类中代码的输出结果:
import java.util.HashSet;
class Test{
public static void main(String[] args) {
//重写了hashCode()和equals() 方法
HashSet set = new HashSet();
Person p1 = new Person(1001, "AA");
Person p2 = new Person(1002, "BB");
set.add(p1);
set.add(p2);
System.out.println(set);
p1.setName("CC");
set.remove(p1);
System.out.println(set);
set.add(new Person(1001,"CC"));
System.out.println(set);
set.add(new Person(1001,"AA"));
System.out.println(set);
}
}
输出结果为:
[Person{id=1002, name='BB'}, Person{id=1001, name='AA'}]
[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}]
[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}, Person{id=1001, name='CC'}]
[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}, Person{id=1001, name='CC'}, Person{id=1001, name='AA'}]
HashSet存放数据的方式是通过hashCode()计算哈希值来比较的,如果哈希值不同就能比较,如果哈希值相同那么再用equals()的方法来进行比较。
- 首先,用已经复写好的hashCode()方法来计算出第一个Person对(1001,“AA”)所对应的哈希值a,再计算第二个Person对象(1002,“BB”)所对应的哈希值b,那么第一个结果就是:
[Person{id=1002, name=‘BB’}, Person{id=1001, name=‘AA’}]
- 接着,注意一个操作:p1.setName(“CC”)
此时,第一个对象的哈希值还是a,存储位置不变,只是改变了name的属性值,而原本的数据中没有(1001,“CC”)所对应的哈希值,所以调remove()方法的时候没有找到想要的这个对象 故第二个结果为:
[Person{id=1002, name=‘BB’}, Person{id=1001, name=‘CC’}]
- 然后,再创建(1001,“CC”)这个对象并计算它的哈希值c,故结果有3个
[Person{id=1002, name=‘BB’}, Person{id=1001, name=‘CC’}, Person{id=1001, name=‘CC’}]
- 最后,又创建了一个对象(1001,“AA”),它的哈希值为a,很显然与前面的重复了,那么这时就要调用equals()方法来比较了此时,第一个对象的姓名为CC,而此时的第四个对象为AA,故两个对象通过equals()方法得到两个对象不一样,所以可以加入,即第四个结果为:
[Person{id=1002, name=‘BB’}, Person{id=1001, name=‘CC’},
Person{id=1001, name=‘CC’}, Person{id=1001, name=‘AA’}]