1.为什么重写hashCode(),为什么一定要重写equals()?
(1) Object中hashCode的值要求两个对象相等,那么他们的hash值也一定相等,Object中的equals()比较的是对象
在内存的地址,重写后的equals()如果属性的值全都相等,那么便表明这两个对象相等,如果不重写hashCode(),
会导致两个对象相等,但hash值不相等
(2) HashSet存放元素时,根据元素的hashCode值快速找到要存储的位置,如果这个位置有元素,
两个对象通过equals()比较,如果返回值为true,则不放入;如果返回值为false,
则这个时候会以链表的形式在同一个位置上存放两个元素,这会使得HashSet的性能降低,
因为不能快速定位了。还有一种情况就是两个对象的hashCode()返回值不同,
但是equals()返回true,这个时候HashSet会把这两个对象都存进去,这就和Set集合不重复的规则相悖了
(3) Object中的hashCode()返回的值不是指对象的内存地址,hashCode返回的值相等,对象不一定相等
Set<Integer> set = new HashSet<>();
for (int i = 0; i < 1000000; i++) {
Role role = new Role(1, "管理员");
set.add(role.hashCode());
}
System.out.println(set.size()); // 结果: 999768