案例09-数据类型不一致导致equals判断为false

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

一:概念说明

数据类型

       数据类型是编程语言中用于定义变量、常量和函数返回值的属性。它指定了数据的种类、范围和操作。不同的数据类型具有不同的内存占用和操作规则,用于存储和处理不同类型的数据。

数据类型分类

  1. 整数类型(Integer):用于表示整数值,如整数型(int)、长整型(long)、短整型(short)和字节型(byte)等。 例如:int age = 25;
  2. 浮点数类型(Floating-point):用于表示带有小数部分的数值,如单精度浮点型(float)和双精度浮点型(double)。 例如:double pi = 3.14159;
  3. 字符类型(Character):用于表示单个字符,如字符型(char)。 例如:char grade = 'A';
  4. 字符串类型(String):用于表示一串字符,如字符串型(String)。 例如:String name = "John";
  5. 布尔类型(Boolean):用于表示真或假的值,如布尔型(boolean)。 例如:boolean isTrue = true;
  6. 数组类型(Array):用于存储多个相同类型的元素的集合。 例如:int[] numbers = {1, 2, 3, 4, 5};
  7. 自定义类型(Custom):根据需要自定义的数据类型,如类和结构体等。

       数据类型的选择取决于所要处理的数据的性质和需求。正确选择和使用数据类型可以提高程序的效率和可靠性,并确保数据的正确性和一致性。

二:背景介绍

       在判断课程id和班级id的时候如果一致就像课程信息进行更新,如果不一致就插入一条新的数据。其实两个变量的值是一致的但是类型是不一致的。这就导致数据库中已经有一条这样的数据了,在判断的时候结果为false,就有插入了一条相同课程班级的数据。数据发生了混乱。

053ad9fcadd04be0903bf7367a7177fb.png

三:思路&方案

       分析equals方法判断两个对象的什么内容,是对象的值还是对象的地址以及基本数据类型的对象是否重写了equals方法。

四:实现过程

1.通过demo来验证equals方法

/**
 * @BelongsProject: demo
 * @BelongsPackage: com.wzl.EqualsByType
 * @Author: Wuzilong
 * @Description: equals判断
 * @CreateTime: 2023-03-03 14:13
 * @Version: 1.0
 */
public class DifferentType {
    public static void main(String[] args) {
        Long  firstVariable =555L;
        String secondVariable="555";
        String thirdVariable="555";
        System.out.println("类型不一致"+firstVariable.equals(secondVariable));
        System.out.println("类型一致"+secondVariable.equals(thirdVariable));
    }
}

e474568bbf1546fba9a4c962e518bea1.png

从执行的结果来看,类型的不一致会导致调用equals方法为false。

2.看一下equals方法的源码

       equals是object类的方法,从object类中看equals方式是比较的对象的地址。也可以从方法的

注释上分析出比较的是两个对象的地址。

The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
Params:
obj – the reference object with which to compare.
Returns:
true if this object is the same as the obj argument; false otherwise.
public boolean equals(Object obj) {
        return (this == obj);
    }

       当我们从例子中的点击进去看equals方法的源码的时候,发现基本数据类型包装类对equals方法进行了重写。

public boolean equals(Object obj) {
        if (obj instanceof Long) {
            return value == ((Long)obj).longValue();
        }
        return false;
    }

       重写之后我们发现在基本数据类型包装类调用的equals方法中会判断传入的对象是不是Long包装类的实例,如果不是就直接返回false。从上面的例子来看String类型的对象不是Long包装类的实例所以直接返回了false。

五:总结

       1.equals方法如果没有进行重写操作的话去比较两个对象的地址

       2.如果对equals方法进行重写,按照重写的逻辑进行。比如判断值或者即判断值又判断地址

       3.对象的数据类型必须相同:如果要比较的两个对象的数据类型不同,那么它们一定不相等,equals方法会直接返回false。

       4.对象的属性值必须相同:即使两个对象的数据类型相同,如果它们的属性值不同,equals方法也会返回false。

六:升华

       我们平时在调用String、Integer等包装类型时的equals方法时是比较的内容是否一致而不是地址一是否致,如果是地址一致,那所有的String类型比较都是相等的,所以包装类类型都重写了equals方法。我们可以根据业务场景的不同来选择是否重写equals方法。


相关文章
|
1月前
如何判断`instanceof`操作符的返回值是否为`true`
`instanceof`操作符用于判断一个对象是否是指定类型或其子类型的实例。如果对象是指定类型的实例,则返回`true`,否则返回`false`。例如:`if (obj instanceof MyClass)` 会检查 `obj` 是否是 `MyClass` 类或其子类的实例。
61 3
|
2月前
|
C# 开发者
【捞底干货】C#中equals和==运算符的区别
【捞底干货】C#中equals和==运算符的区别
70 1
TS定义布尔值,let flag:boolean = true,定义数字类型 let a1:number = 10,赋值 let str1:string = ‘‘,打印c~.log($(str1))
TS定义布尔值,let flag:boolean = true,定义数字类型 let a1:number = 10,赋值 let str1:string = ‘‘,打印c~.log($(str1))
项目实战典型案例9——数据类型不一致导致equals判断为false
项目实战典型案例9——数据类型不一致导致equals判断为false
74 0
|
SQL Oracle 关系型数据库
【问题处理】—— SQL里进行 null值 的判断永远返回 false?
【问题处理】—— SQL里进行 null值 的判断永远返回 false?
103 0
|
JavaScript 前端开发 Java
为什么使用typeof判断数据类型的时候null出来是object?
为什么使用typeof判断数据类型的时候null出来是object?
|
Java
项目实战09—数据类型不一致导致equals判断为false
项目实战09—数据类型不一致导致equals判断为false
104 0
【项目实战典型案例】09.数据类型不一致导致equals判断为false
【项目实战典型案例】09.数据类型不一致导致equals判断为false
|
存储
==与equals方法的区别
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量的引用地址是否相等,只能用==操作符。
133 0
声明了Integer类型的两个数值并且值相等,但为什么返回了false?
声明了Integer类型的两个数值并且值相等,但为什么返回了false?
209 0