Java学习 Set集合怎么保证数据的不重复
我们都知道Set集合不能包含重复数据,那么Set是怎么保证数据不重复,怎么比较要加入的数据到底和已加入的数据以及不同数据的定义是什么?
public class HashSetDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
HashSet hs = new HashSet();
Person p1 = new Person("张三",21);
Person p2 = new Person("李四",22);
Person p3 = new Person("王五",23);
Person p4 = new Person("六六",21);
Person p5 = new Person("六六",21);
Person p6 = new Person("六六",21);
hs.add(p1);
hs.add(p2);
hs.add(p3);
hs.add(p4);
hs.add(p5);
hs.add(p6);
System.out.println(hs);
}
}
结果如下:
[李四 22, 六六 21, 六六 21, 六六 21, 王五 23, 张三 21]
因为当我们向Set集合加入数据时,要加入的数据会和集合里的数据比较
会先比较hashCode()的值,如果不同那么jvm就会认为这是两个不同的数据 就会直接加入,
而如果hashCode()的值相同,jvm会调用equals()来比较,如果相同就认为是一个数据,否则 就是两个数据。(当hashCode()的值不同是就不会继续调用equals()了)
上图 这是没有重写hashCode和equals时代码运行结果
这是只重写了hashCode的结果
这是重写了hashCode和equals的结果
这是hashCode代码和equals运行时刻,我们发现之前当hashCode不同时,
没有调用equals方法,而后两个要加入时,发现集合有一个元素hashCode相同,这时候才调用了equals方法。