在这一节的视频中,Student类中的HashSet.老师并没有重写HashSet中的equals()方法和hashCode()方法,为什么能实现不重复添加同一元素的功能?而我自己写的,就必须重写equals()和hashCode()才能实现同样的功能?
equals(),hashCode()是用来比较对象进行查询的,而Set集合框架中不允许结点相同,是系统设定的,比如他比较的可能是对象中的变量,如整形,字符串等等,而他们默认都是可以比较的。又或者从更底层的数据进行比较。
我自己写了个程序测试了一下:
import java.util.Set;
import java.util.HashSet;
class Student {
private String id;
private String name;
public Student(String id, String name) {
this.id = id;
this.name = name;
}
public String toString() {
return id + ":" + name;
}
}
public class HashSetTest {
public static void main(String[] args) {
Set<Student> s = new HashSet<Student>();
Student st = new Student("1", "张三");
s.add(st);
s.add(st);
s.add(new Student("2", "李四"));
s.add(new Student("2", "李四"));
for (Student stu : s) {
System.out.println(stu);
}
}
}
运行结果是:
1:张三
2:李四
2:李四
由此可以推测出,没有重写equals(),hashCode()方法的HashSet默认的不重复添加同一元素,指的是不重复添加同一块内存。程序中前面两次添加st,只成功添加了一次,因为第二次添加的是同一块内存,所以没有成功。后面添加的两个对象,是new出来的两块不同的内存,所以都添加了进去。如果要想达到不重复添加同内容的元素,就必须重写HashSet中的equals()和hashCode()方法。还是要谢谢你!!