问答详情
源自:4-11 学生选课---通过 Set 集合管理课程

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

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

提问者:慕圣0830664 2017-04-29 17:56

个回答

  • 慕粉4014187从头再来
    2017-04-29 18:44:22
    已采纳

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

  • 慕圣0830664
    2017-04-29 20:00:04

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