项目实战典型案例9——数据类型不一致导致equals判断为false
创始人
2025-05-28 23:28:34

数据类型不一致导致equals判断为false

  • 一:背景介绍
  • 二:思路&方案
    • 结论
  • 三:equals的使用技巧

一:背景介绍

对课程id和班级id分别进行判断,如果分别一致就更新该课程班班级信息,拖过不一致就插入新的一条数据。由于这里使用将两个类型不一致的变量使用equals进行比较,结果肯定为false,导致会插入相同课程班级的数据,从而导致数据混乱。
在这里插入图片描述

二:思路&方案

上面出现的问题主要原因是对于equals的使用有误,不清楚如何使用equals导致出现的问题。下面让我们来看一下如何正确的使用equals以及使用equals的一些技巧。

  1. 查看一下equals方法的源码,equals是Object类中的方法,可以从Object类中看出equals方法比较的是对象的地址。
public boolean equals(Object obj) {return this == obj;}
  1. 以包装类Integer为例,是对equals进行了重写,我们可以看出比较的是内容。其实对于其他基本类型的包装类型来说equals都是比较的内容。
public boolean equals(Object obj) {//如果指定对象是Integer类型,则继续if (obj instanceof Integer) {//则先将该对象强转为Integer对象,比较内容return this.value == (Integer)obj;} else {return false;}}

结论

  1. 如果equals方法没有被重写,那么比较的是两个对象的地址
  2. 如果equals方法被重写,那么走的是重写的逻辑。
  3. 基本类型的包装类型都对equals方法进行了重写,比较的都是值,而不是地址。

三:equals的使用技巧

主要依据阿里规约中对于equals使用的注意事项

基本数据类型与其对应的包装类型

基本数据类型对应的包装类型
byte(整数类型)Byte
short(整数类型)Short
int (整数类型)Integer
long(整数类型)Long
float(浮点类型)Float
double(浮点类型)Double
char(字符类型)Character
booleanBoolean
  1. Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。

  2. 所有整型包装类对象之间值的比较,全部使用 equals 方法比较。
    说明:对于 Integer var = ? 在 -128 至 127 之间的赋值,Integer 对象是在 IntegerCache.cache 产生,会复用已有对
    象,这个区间内的 Integer 值可以直接使用 == 进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复
    用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。

public class Client {public static void main(String[] args) {Integer a =128;Integer b=128;Integer c=127;Integer d=127;System.out.println(a.equals(b));System.out.println(a==b);System.out.println(c==d);}

在这里插入图片描述

  1. 浮点数之间的等值判断,基本数据类型不能使用 == 进行比较,包装数据类型不能使用 equals
    进行判断。

    说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精确表示大部分的十进制小数。

可以使用BigDecimal来定义值,再进行浮点数的运算操作。

public static void main(String[] args) {BigDecimal a = new BigDecimal("1.0");BigDecimal b = new BigDecimal("0.9");BigDecimal c = new BigDecimal("0.8");BigDecimal x = a.subtract(b);BigDecimal y = b.subtract(c);if (x.compareTo(y) == 0) {System.out.println("true");}}

在这里插入图片描述

  1. BigDecimal 的等值比较应使用 compareTo() 方法,而不是 equals() 方法。
    说明:equals() 方法会比较值和精度(1.0 与 1.00 返回结果为 false),而 compareTo() 则会忽略精度。

相关内容

热门资讯

于选择的英文作文【推荐6篇】 于选择的英文作文 篇一The Power of ChoiceChoice is a fundamen...
学校生活英语作文 学校生活英语作文(通用22篇)  在平平淡淡的日常中,许多人都有过写作文的经历,对作文都不陌生吧,作...
介绍家乡英语作文(精彩6篇) 介绍家乡英语作文 篇一My HometownI come from a small town cal...
阅读的英语作文Reading... 阅读的英语作文Reading 篇一The Importance of ReadingReading ...
优秀英语作文 优秀英语作文(通用34篇)  在日复一日的学习、工作或生活中,大家都尝试过写作文吧,作文一定要做到主...