重写equals()
@Override
public boolean equals(Object o){
if(this == o) return true;
if(o == null || getClass() != o.getClass()) return false;
User user = (User) o;
retrun Objects.equals(name, user.name) && age == user.age;
}
-
为什么不能使用
instanceof
呢?因为当一个类与它的子类进行比较时,用instanceof方法返回的也是true
-
为什么不全部使用
==
进行比较呢?比较时,要求基本类型相等,引用类型需要使用java.util.Objects类的equals静态方法进行对比
重写hashCode()
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
-
在equals方法没被修改的前提下,多次调用同一对象的hashcode方法返回的值必须是相同的整数
-
如果两个对象互相equals,那么这两个对象的hashcode值必须相等
-
为不同对象生成不同的hashcode可以提升哈希表的性能
-
为什么使用
31
作为基数呢?- 基数要用是质数,每个对象根据值计算HashCode,这个code大小虽然不奢求必须唯一,但是要尽可能的不要重复,因此基数要尽量的大,并且31只占用5bits。
- 所以从效率上,31是2的5次减1,对计算机来说2的乘除操作只需要做位移操作(1<<5 - 1)。 也就是说31对计算机的角度来说运算更快、切占内存不多不少,而且形成惯例,虚拟机甚至都专门对他做了优化。