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

news/2024/4/20 1:44:02/

目录

    • 方法作用
    • 实战案例

方法作用

  • 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;@Overridepublic 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);}@Overridepublic 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.ppmy.cn/news/108848.html

相关文章

HNU-电子测试平台与工具2-Veriog答案

这个题目很阴间,做了两次,还是只有90分,我也不知道错在哪里,怎么改。 我把两次的答案发一下,各位自己仁者见仁,智者见智。 有时间的话我再做吧。 第一次: 第二次:

Map、Set和哈希表(数据结构系列14)

目录 前言&#xff1a; 1.搜索树 1.1概念 1.2插入 1.3查找 1.4删除 1.5二叉搜索树整体代码展示 2. Map和Set的讲解 2.1 Map的说明 2.1.1Map的方法 2.2 Set 的说明 2.2.1Set的方法 3.哈希表 3.1哈希表的概念 3.2哈希冲突 3.3冲突的避免 3.4哈希冲突的解决 3.4…

有哪些代码编辑器可以推荐? - 易智编译EaseEditing

以下是一些常用的代码编辑器&#xff0c;并对它们进行简单介绍&#xff1a; Visual Studio Code&#xff1a; Visual Studio Code&#xff08;简称VS Code&#xff09;是由微软开发的免费、跨平台的代码编辑器。 它具有丰富的功能和插件生态系统&#xff0c;支持多种编程语言…

内网渗透(八十六)之Exchange ProxyLogon攻击链利用

Exchange ProxyLogon攻击链利用 漏洞背景 2021年3月2日,微软发布了Exchange服务器的紧急安全更新,修复了如下7个相关的漏洞。 Exchange服务端请求伪造漏洞(CVE-2021-26855):未经身份验证的攻击者能够构造HTTP请求扫描内网并通过Exchange服务器进行身份验证。Exchange反序列…

数列DP进阶

目录 一&#xff0c;斜率优化 1&#xff0c;斜率优化原理 2&#xff0c;凸包和斜率计算 3&#xff0c;实战 黑暗爆炸 - 4709 柠檬 二&#xff0c;else 力扣 644. 子数组最大平均数 II&#xff08;最大子段和二分&#xff09; ​力扣 646. 最长数对链 力扣 1235. 规划兼…

寻求帮助:尝试在深度学习领域找创新点

尝试在深度学习领域找创新点 写在最前面思路第一步&#xff1a;找到现有问题&#xff08;改进方向&#xff09;第二步&#xff1a;确认解决方案第三步&#xff1a;学习方法步骤第四步&#xff1a;改进创新归纳第五步&#xff1a;可视化说明 其他A算法部分嵌入B交叉applicationc…

让进程能够“相互沟通”的高级方式一:匿名管道

代码运行及测试环境&#xff1a;linux centos7.6 在阅读这篇文章时&#xff0c;需要掌握OS对文件管理的基础知识&#xff08;文件打开表、文件描述符、索引结点…&#xff09; 前言 我们都知道进程是具有独立性的&#xff0c;意味着进程之间无法相互通信。但在一些情况下&…

八大排序:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序

文章目录 排序概念常见的排序算法常见排序算法的实现直接插入排序希尔排序选择排序堆排序冒泡排序快速排序递归实现Hoare版本挖坑法前后指针法 非递归实现Hoare版本挖坑法前后指针法 快速排序俩个优化 归并排序递归实现非递归实现外排序 计数排序 常见排序算法的性能分析 排序概…

MySQL_8 相当牛逼的索引机制

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

bat批处理一键安装、卸载mysql数据库

文章目录 1 一键安装1.1 启动延迟扩展模式1.2 切换盘符到bat所在路径1.3 新建data文件夹1.4 设置变量1.5 新建my.ini并写入配置1.6 安装mysql服务并初始化数据库1.7 初始化文件1.8 添加环境变量1.9 全部代码如下&#xff0c;复制放到与bin目录同级即可使用 2 一键卸载 1 一键安…

随机梯度下降法

梯度下降法有两个比较大的缺点&#xff1a; --计算花时间 --容易陷入局部最优解 比如以下形状的函数&#xff0c;最优解取决于初始值的选取。 梯度下降法的表达式如下&#xff0c;这个表达式使用了所有训练数据的误差&#xff1a; 随机梯度下降法表达式&#xff1a; 在随机梯…

Ctfshow基础二刷(1)

前言&#xff1a; 前两天的信安给我整emo了&#xff0c;头一回打正经比赛&#xff0c;结果发现基础太差&#xff0c;代码审计烂得一踏糊涂。 寻思寻思&#xff0c;从头整一遍基础。又买了安恒出的新书。争取7号去吉林打省队选拔不给导儿丢脸吧呜呜 文件包含 web78: 这题一…

数字滚动插件的使用

数字滚动插件的使用 安装插件 $ npm i vue-count-to使用数字滚动插件 使用count-to组件来代替要显示的数字 <span>组织总人数</span> <!-- 起始值 终点值 滚动时间 --> <count-to:start-val"0":end-val"228":duration"1000&…

PointNet++ 源码解读

1.从main函数开始&#xff1a; 1.1 确定使用的哪个GPU. 1.2 保存训练时的参数和日志 2. 加载数据 先找到存放训练和测试数据的目录&#xff0c;接下来加载相关的数据参数&#xff1a; 下面是执行的结果&#xff1a; 接下来为训练样本开始做准备&#xff1a; 给不同标签做上标记…

【网络编程二】UDP与TCP协议你学会了吗~

目录 &#x1f31f;需要知道 1、什么是网络编程&#xff1f; 2、怎么进行网络编程&#xff1f; 3、TCP与UDP的区别&#xff1f; &#xff08;面试题&#xff09; &#x1f31f;一、UDP &#x1f308;1、UDP数据报套接字编程 &#x1f308;2、实现一个简单的UDP回显服务…

PWM(脉宽调制)和PID(比例-积分-微分)是两种常用的控制技术,他们的区别是什么?

pwm是开环&#xff0c;pid是闭环&#xff0c;pwm和pid可以结合使用。 PWM&#xff08;脉宽调制&#xff09;和PID&#xff08;比例-积分-微分&#xff09;是两种常用的控制技术&#xff0c;它们在不同的应用中有不同的作用和工作原理。 PWM是一种用于调节电子设备的输出信号的…

生成式模型的质量评估标准

Sample Quality Matrix 如何评价生成式模型的效果&#xff1f;ISFIDsFIDPrecision & RecallPrecisonRecall计算precision和recall 如何评价生成式模型的效果&#xff1f; Quality: 真实性&#xff08;逼真&#xff0c;狗咬有四条腿&#xff09; Diversity: 多样性&#x…

【致敬技术人】HTTP协议是什么?

前言 HTTP&#xff0c;中文意思是指超文本传输协议&#xff0c;指的是在网络&#xff0c;网络之间或者是计算机用户与计算机用户之间进行网络传输和文件传输的一种超文本传输协议&#xff0c;对计算机安全和网络安全起着至关重要的作用。 一、HTTP是什么&#xff1f; 超文本…

Excel中index、match函数使用

Index和Match函数是Excel中非常强大的函数&#xff0c;通常用来在一个特定的数据范围中查找和定位特定的值。 Index函数用于从一个数组或矩阵中返回一个单元格或一组单元格的数值&#xff0c;而Match函数则用于查找特定值在数组或矩阵中的位置。接下来&#xff0c;我会逐步详细…

03灰度变换与空间滤波

文章目录 3灰度变换与空间滤波3.1背景知识3.1.1灰度变换和空间滤波基础 3.2一些基本的灰度变换函数3.2.1图像反转3.2.2对数变换3.2.3幂律&#xff08;伽马&#xff09;变换3.2.4分段线性变换函数 3.3直方图处理3.3.1直方图均衡3.3.2直方图匹配&#xff08;规定化&#xff09;3.…