为了账号安全,请及时绑定邮箱和手机立即绑定

关于Student类中,HashSet是否会重复添加同一元素的问题

在这一节的视频中,Student类中的HashSet.老师并没有重写HashSet中的equals()方法和hashCode()方法,为什么能实现不重复添加同一元素的功能?而我自己写的,就必须重写equals()和hashCode()才能实现同样的功能?

正在回答

2 回答

equals(),hashCode()是用来比较对象进行查询的,而Set集合框架中不允许结点相同,是系统设定的,比如他比较的可能是对象中的变量,如整形,字符串等等,而他们默认都是可以比较的。又或者从更底层的数据进行比较。

0 回复 有任何疑惑可以回复我~

我自己写了个程序测试了一下:
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()方法。还是要谢谢你!!

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

关于Student类中,HashSet是否会重复添加同一元素的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信