为什么有些情况下需要重写equals()和hashCode()方法?

news2024/11/29 5:43:33

目录

    • 方法作用
    • 实战案例

方法作用

  • equals():判断对象是否相等,比如判断是否能放入Set集合中
    • 情况1:没有重写equals()方法:由于所有类的默认基类都是Object类,所以默认使用Object类的equals()方法,那就是对象的引用地址
    • 情况2:重写equals()方法:用重写equals()方法进行判断两个对象是否相等
  • hashCode():决定对象存储位置,比如在Set集合中的存储位置
    - 没有重写hashCode()方法:由于所有类的默认基类都是Object类,所以默认使用Object类的hashCode()方法,那就该对象默认的hashcode
    - 重写hashCode()方法:用重写hashCode()方法来决定对象放置位置

实战案例

我目前在看开源项目tduck-platform,然后想了解一下问卷调查的周收集趋势是如何生成的,效果图如下:

在这里插入图片描述
其实可以想到需要在查询数据库的时候需要按照“年月日”方式进行聚合,但是这样只能获取到有数据的情况,但是你可以看到上面例如2023-05-30是0,这种情况肯定不存在聚合结果中的,所以我们需要对聚合结果进行填充0操作,最常想到的方式是遍历这几天,看一下这一天是否已经存在了,存在就不填充了,否则就填充,基本也是这个意思,但是判断就需要使用到if语句,不是特别优雅,我们看一个优雅的操作,代码如下:

备注:具体代码路径

// 获取当前日期
Date now = new Date();
// 获取本周开始时间
DateTime startTime = DateUtil.beginOfWeek(now);
// 获取本周结束时间
DateTime endTime = DateUtil.endOfWeek(now);
// 获取本周的统计数据,注意人家在sql语句中用到了WHERE create_time >= YEARWEEK(now())
1Set<SituationVO> reportSituations = formDashboardMapper.selectFormReportSituation(formKey);
// 将本周的天数情况罗列一下
2List<DateTime> dateTimes = DateUtil.rangeToList(startTime, endTime, DateField.DAY_OF_WEEK);
// 填充不存在的天数情况,这块是最优秀的,我们下面好好分析
3、dateTimes.forEach(time -> {
    reportSituations.add(new SituationVO(time.toString(DatePattern.NORM_DATE_PATTERN), 0));
});
// 按照创建时间进行升序排序
return CollectionUtil.sort(reportSituations, (o1, o2) -> DateUtil.parse(o1.getCreateTime(), DatePattern.NORM_DATE_PATTERN)
        .isAfter(DateUtil.parse(o2.getCreateTime(), DatePattern.NORM_DATE_PATTERN)) ? 1 : -1);

上面提到的SituationVO就是本次讲解的重点,我们看一下该类内部信息,如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class SituationVO {
    private String createTime;

    private Integer count;


    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        SituationVO situation = (SituationVO) o;
        return Objects.equal(createTime, situation.createTime);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(createTime);
    }
}

可以看到equals()方法被重写了,通过createTime来判断两个SituationVO对象是否相等,就我们上面的例子来看,位置1已经生成了SituationVO对象的Set集合,位置2生成了本周的所有天数信息,位置3遍历本周的天气信息,然后往Set集合reportSituations中填充其他SituationVO对象,由于Set集合中元素不能重复,所以会判断SituationVO对象是否重复,由于我们重写了SituationVO类的equals()方法,所以createTime相同的SituationVO对象就不会在写入了,这就会完成填充0操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

局域网内网穿透技术

文章目录 一、内网穿透概述1、传统内网穿透介绍2、ZeroTier和Tailscale 二、ZeroTier1、概述1.1 介绍1.2 相关概念 2、ZeroTier简单使用3、Moon搭建3.1 介绍3.2 部署Moon服务3.3 使用 Moon 服务 4、流量转发与局域网访问4.1 概述4.2 转发服务器配置4.3 客户端配置 三、Tailscal…

vulnhub靶场渗透之SickOs1.2渗透教程(超级详细)

vulnhub靶场渗透之SickOs1.2渗透教程目录 0x01靶机概述 0x02靶场环境搭建 0x03靶机信息发现 0x04渗透靶机 使用第二种方法&#xff1a;msfvenom生成载荷模块curl上传至服务器触发 0x05本地提权 方法一&#xff1a;将当前用户&#xff08;www-data&#xff09;加入sudo组 提…

SSM编程---Day 05

目录 一、IOC &#xff08;一&#xff09;企业级系统的特点&#xff1a; &#xff08;二&#xff09;Spring框架的优点&#xff1a; &#xff08;三&#xff09;ApplicationContext的作用&#xff1a; &#xff08;四&#xff09;理解IOC原理、掌握IOC的配置 二、AOP&…

三种快速转换PDF为TXT的方法:简单、高效、免费

如何将PDF转换为TXT文件&#xff1f;在日常生活中&#xff0c;PDF和TXT是常见的文本格式。PDF格式文件具有稳定的布局和易于存储的特点。然而&#xff0c;许多在线下载的电子书通常是以PDF格式提供的&#xff0c;而电子阅读器通常不支持PDF格式&#xff0c;这就导致了无法方便地…

【makefile】顶层Makefile向下层Makefile传递参数

一个项目中为了方便管理&#xff0c;每一个模块都会配一个makefile 以便于管理&#xff0c;我们实际在编译的时候&#xff0c;可能只编译其中某一个模块。偶尔下层的Makefile会需要用到上层Makefile文件中的某一个变量或者函数。 下面主要介绍两种方法&#xff0c;分别使用inc…

Innodb底层原理与Mysql日志机制深入剖析

1.MySQL的内部组件结构 客户端执行sql语句&#xff0c;这时mysql会把sql语句发给server层连接器&#xff0c;连接器通过账号密码端口号进行连接数据库&#xff0c;验证成功后&#xff0c;然后在权限表里查询相应的权限&#xff0c;然后依赖于此时读取权限&#xff0c;连接器把s…

【项目】Q-ROBOT移动机器人设计与开发

本文主要记录Q-ROBOT移动机器人的开发流程~ github: GitHub - Qsx567/SLAMCarProject &#xff08;持续更新中~希望各位铁子走过路过给个小小的star&#xff01;灰常感谢&#xff01;&#xff09; 本项目为我设计的移动SLAM机器人&#xff0c;命名为&#xff1a; Q-Robot 机…

【Python Dash】零基础也能轻松掌握的学习路线与参考资料

Python Dash是一个可视化框架&#xff0c;可以帮助开发者快速构建交互式仪表板和应用程序。它基于Plotly.js库建立&#xff0c;提供了一种易于使用的Python界面&#xff0c;用户可以通过简单的Python代码创建仪表板和应用程序。本篇文章将介绍Python Dash的学习路线&#xff0c…

【学习日记2023.5.30】之 订单处理 订单状态定时处理_来单提醒_用户催单

文章目录 10. 订单处理10.1 Spring Task10.1.1 介绍10.1.2 cron表达式10.1.3 入门案例10.1.3.1 Spring Task使用步骤10.1.3.2 代码开发10.1.3.3 功能测试 10.1.4提交代码 10.2 订单状态定时处理10.2.1 需求分析10.2.2 代码开发10.2.3 功能测试 10.3 WebSocket10.3.1 介绍10.3.2…

互联网产品岗

文章目录 产品岗分类工具类社交类内容类平台类 职级划分工作流程refer: 产品岗分类 注&#xff1a;产品岗的分类并不绝对&#xff0c;因为大部分的产品都有符合属性&#xff0c;这里的分类主要便于理解&#xff08;越写越觉得很多东西没得分&#xff09; 工具类 定义&#x…

MySQL查询当前数据和上一行数据比较、业务数据的趋势分析、数据变动的监控和报警

标题: 使用MySQL查询当前数据和上一行数据比较的场景 在MySQL中&#xff0c;我们经常需要对数据进行比较和分析。其中一种常见的需求是查询数据列表并与前一行的数据进行比较。这种场景可以通过使用窗口函数或连接来实现。本文将介绍使用MySQL查询比较数据和上一行数据的场景&a…

【Unity Shader】Plane实现风格化水

写在前面 长文警告&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 很久没更新博客了&#xff0c;&#xff0c;这次是要做一个风格化水效果&#xff0c;是基于Plane着色实现水面效果。 项目&#xff1a;Unity 2017.4.40f1 Build-in&#xff0c;因此实现过程会…

ChatGPT vs Google:谁是答案之王?微软揭示未来搜索的样子

已经习惯了网购的你&#xff0c;有没有想过一旦电子商务行业遭受重创&#xff0c;会对我们的日常生活造成什么影响呢&#xff1f; 我们已经习惯了在生活中碰到什么不懂的事情就 Google 一下或者百度一下&#xff0c;甚至许多人的职业都跟 Google 密切相关&#xff0c;比如自媒…

从外包到转岗华为正式员工月薪17K,这一百多天的心酸谁能懂.....

本人毕业于某普通二本院校非计算机专业&#xff0c;跨专业入行测试&#xff0c;至今有近 5年工作经验。 第一份测试工作是在华为做了两年外包。总体感受就是 这份工作缺乏归属感&#xff0c;心里总有一种落差&#xff0c;进步空间不大&#xff0c; 接触不到核心技术&#xf…

跨端框架+小程序容器:一种让App开发提高效率的思路

WePY&#xff08;微信小程序开发框架&#xff09;是一个基于组件化开发思想的微信小程序开发框架。它类似于Vue.js框架&#xff0c;通过封装小程序原生的API&#xff0c;提供了更加简洁、高效的开发方式。 WePY的主要特点包括&#xff1a; 组件化开发&#xff1a;WePY将页面拆…

matplotlib常用功能汇总

文章目录 1.IDE里的1.1 显示模式&#xff08;plt.ion()和plt.ioff()&#xff09;1.2 backend说明 2 jupyter里的3 通用的3.1 cmap3.2 subplot()相关3.3 绘制动态图&#xff08;Animation类&#xff09;3.4 matplotlib利用rcParams配置样式参数 4. 与opencv连用可能遭遇的问题1.…

MySQL_8 相当牛逼的索引机制

目录 一、索引机制的引入 1.索引机制&#x1f402;B在哪里&#xff1f; 2.索引机制提高查询速度的原理 : 二、索引的创建 1.索引分类 : 2.使用格式 : 3.代码演示 : 三、索引的删除 1.格式 : 2.演示 : 四、索引的查询 1.格式 : 2.演示 : 五、索引的使用规则 一、索…

Linux---强制停止、退出登出、history、yum

1. ctrl c 强制停止 Linux某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键ctrl c&#xff1a; [shaonianlocalhost ~]$ tail ^C [shaonianlocalhost ~]$ 命令输入错误&#xff0c;也可以通过快捷键ctrl c&#xff0c;退出当前输入&#xff0c;重…

如何在 Alpine Linux 上启用或禁用防火墙?

防火墙是计算机网络安全的重要组成部分&#xff0c;它用于保护计算机和网络免受未经授权的访问和恶意攻击。Alpine Linux 是一种轻量级的 Linux 发行版&#xff0c;常用于构建容器化应用和嵌入式系统。本文将详细介绍如何在 Alpine Linux 上启用或禁用防火墙。步骤 1&#xff1…

MySQL复习

文章目录 1、操作数据库1.1、操作数据库1.2、数据库的数据类型1.3、数据库的字段属性1.4、创建数据表1.5、MyISAM和InnoDB1.6、修改删除表 2、MySQL数据管理2.1、外键2.2、DML语言&#xff08;全部记住&#xff09;2.3、添加2.4、修改2.5、删除 3、DQL查询数据3.1、DQL3.2、查询…