ai1261107529 发表于 2022-4-23 14:57

HashSet重写hashcod问题

重写hashcode后, 通过控制台看到s1,s2的哈希值相同,为什么equals比较返回结果为false呢






public class SetDemo3 {    public static void main(String[] args) {
      //Set集合去重复原因:先判断哈希值,再判断equals
      Set<Student> sets = new HashSet<>();

      Student s1 = new Student("无恙",20,'男');
      Student s2 = new Student("无恙",20,'男');
      Student s3 = new Student("周雄",21,'男');
      System.out.println(s1.hashCode());
      System.out.println(s2.hashCode());
      System.out.println(s3.hashCode());

      System.out.println(Objects.equals(s1, s2)); //更安全,内部还是 s1.equals(s2);
      System.out.println(s1.equals(s2));

      System.out.println(s1 == s2);
      System.out.println(s1);
      System.out.println(s2);

      sets.add(s1);
      sets.add(s2);
      sets.add(s3);
      System.out.println(sets);
    }
}



=================================================只重写了hashcode=====================================================================/**
      只要两个对象内容一样,结果一定是true
   * @Param o
   * @return
   */
//    @Override
//    public boolean equals(Object o) {
//      if (this == o) return true;
//      if (o == null || getClass() != o.getClass()) return false;
//      Student student = (Student) o;
//      return age == student.age && sex == student.sex && Objects.equals(name, student.name);
//    }

    /**

   */
    @Override
    public int hashCode() {
      return Objects.hash(name, age,sex);
    }

Todd 发表于 2022-4-23 17:41

都用idea了为什么不舍得点进去看看源码呢

Todd 发表于 2022-4-23 17:51

这个块就是解决hash冲突的,也就是hashcode 相同怎么办

Todd 发表于 2022-4-23 17:56

很简单,因为用的是Object的equals方法
而Object的equals方法并不是比较的 hashCode值
而是比较的内存地址
System.out.println 会调用对象的toString 方法 你没实现 默认也是调用Object的
而Object的toString 方法输出的后缀不是内存地址,而是hashCode的16进制的表示
页: [1]
查看完整版本: HashSet重写hashcod问题