前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java重写equals和hashCode方法

Java重写equals和hashCode方法

作者头像
夹胡碰
发布2020-08-14 16:25:24
6.2K0
发布2020-08-14 16:25:24
举报
文章被收录于专栏:程序猿~程序猿~
前言
  • 重写equals和hashCode方法,可加深对hash算法的理解
为什么重写
  • 重写equals方法为了判断对象是否在逻辑上为同一个对象
  • 重写hashCode方法是为了提高hash效率, 并且和equals保持一致
什么场景需要重写
  • 场景: 用户User对象去重 比如有对象User, 其中包含用户id和用户名称, 需要对大量用户进行去重操作, 这时就需要重写User对象的hashCode和equals方法, 并使用set容器去重。
如何重写
  • 代码如下
代码语言:javascript
复制
import java.util.Objects;
/**
 * 重写User对象的equals和hashCode方法
 **/
public class User {

    private String id;//用户Id
    private String name;//用户名称
    
    //... getter setter Constructor

    //重写equals方法表示 id 和 name 相同的对象就判定为相同对象
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(id, user.id) &&
                Objects.equals(name, user.name);
    }
    
    //重写hashCode详见Objects.hash()方法
    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }
}
  • Object.hash核心代码
代码语言:javascript
复制
// 最终调用 Arrays.hashCode 方法
public static int hashCode(Object a[]) {
    if (a == null)
        return 0;

    int result = 1;
    //hashCode核心计算
    //前一对象hashCode*31 + 后一对象hashCode, 并依次累加
    //注意: 乘积系数31为系统选定的较优系数, 参见String的hashCode方法, 下面也有详细介绍
    for (Object element : a)
        result = 31 * result + (element == null ? 0 : element.hashCode());

    return result;
}
去重操作
代码语言:javascript
复制
//对用户进行去重, 简单方便
public Set<User> getUserSet(List<User> userList){
    Set<User> userSet = new HashSet<>();
    userList.stream().forEach(u -> userSet.add(u));
    return userSet;
}
结论
  • 理解了equals和hashCode方法的重写, 就理解了hash算法
拓展
1. 为什么hashCode乘积系数为31
  • 更少的乘积结果冲突 31是个不大不小的质数, 能保证乘积有足够的离散率, 并且保证最后的hashCode不至于过大超出int范围
  • 计算可被JVM优化 32 * i 可以使用位运算, 进行高效计算, 可以写成 i << 5 31 * i 可以被优化成 (i << 5) - i, 从而进行高效运算
2.idea 自动生成equals和hashCode重写方法
  • 使用IDEA, 在类中按 Alt + Insert 可以自动实现equals() 和 hashCode() 方法的重写, 并可以选择重写的代码的实现方式, 包括原生、commons-lang、guava等, 操作如下:
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 为什么重写
  • 什么场景需要重写
  • 如何重写
  • 去重操作
  • 结论
  • 拓展
    • 1. 为什么hashCode乘积系数为31
      • 2.idea 自动生成equals和hashCode重写方法
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档