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);
} 都用idea了为什么不舍得点进去看看源码呢
这个块就是解决hash冲突的,也就是hashcode 相同怎么办 很简单,因为用的是Object的equals方法
而Object的equals方法并不是比较的 hashCode值
而是比较的内存地址
System.out.println 会调用对象的toString 方法 你没实现 默认也是调用Object的
而Object的toString 方法输出的后缀不是内存地址,而是hashCode的16进制的表示
页:
[1]