重写equals和hashCode方法

重写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对计算机的角度来说运算更快、切占内存不多不少,而且形成惯例,虚拟机甚至都专门对他做了优化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值