目录
一、背景介绍
在判断课程id和班级id的时候,如果类型一致就会更新课程信息,如果类型不一致就会插入一条新的数据。其实两个变量的值是一致的,只不过数据类型不一致,从而导致了,在判断的时候结果为false,就会往库中插入一条相同课程班级的数据。结果数据发生了混乱的情况。
二、概念说明
1、数据类型
数据类型是编程语言中用于定义变量、常量和函数返回值的属性。它指定了数据的种类、范围和操作。不同的数据类型具有不同的内存占用和操作规则,用于存储和处理不同类型的数据
2、数据类型分类
- 整数类型(Integer):用于表示整数值,如整数型(int)、长整型(long)、短整型(short)和字节型(byte)等。 例如:int age = 25;
- 浮点数类型(Floating-point):用于表示带有小数部分的数值,如单精度浮点型(float)和双精度浮点型(double)。 例如:double pi = 3.14159;
- 字符类型(Character):用于表示单个字符,如字符型(char)。 例如:char grade = ‘A’;
- 字符串类型(String):用于表示一串字符,如字符串型(String)。 例如:String name = “John”;
- 布尔类型(Boolean):用于表示真或假的值,如布尔型(boolean)。 例如:boolean isTrue = true;
- 数组类型(Array):用于存储多个相同类型的元素的集合。 例如:int[] numbers = {1, 2, 3, 4, 5};
- 自定义类型(Custom):根据需要自定义的数据类型,如类和结构体等。
数据类型的选择取决于所要处理的数据的性质和需求。正确选择和使用数据类型可以提高程序的效率和可靠性,并确保数据的正确性和一致性。
三、分析equals()方法
Object类中的equals()方法用于检测一个对象是否等于另外一个对象
1、equals()语法
public boolean equals(Object obj) {
return (this == obj);
}
在Object类中,equals方法判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,则返回true,否则返回false。
2、equals()重写规则
- 自反性:对于任何非空引用x,x.equals(x)应该返回true
- 对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true
- 传递性:对于任何引用 x、y 和 z ,如果 x.equals(y) 返回 true,y.equals(z)返回true, x.equals(z) 也应该返回 true。
- 一致性:对于任何引用 x、y 和 z ,如果 x.equals(y) 返回 true,y.equals(z)返回true, x.equals(z) 也应该返回 true。
- 非空性:对于任意非空引用x,x.equals(null)应该返回false。
3、String类对equals重写
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
四、验证equals()方法过程
package com.wangsiqi.equals;
/**
* @BelongsProject: 反射的使用
* @BelongsPackage: com.wangsiqi.equals
* @Author: wangsiqi
* @Description: 数据类型不一致导致equals判断为false
* @CreateTime: 2023-03-16 14:21
* @Version: 1.0
*/
public class DataType {
public static void main(String[] args) {
Long one = 123L;
String two = "123";
String three = "123";
System.out.println("类型不一致" + one.equals(two));
System.out.println("类型一致" + two.equals(three));
}
}
从执行结果来看,类型不一致会导致调用equals方法为false
五、总结
- equals方法不能作用于基本数据类型的变量
- 如果没有对Object中equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址,反之则比较的是内容
- equals方法如果没有进行重写操作的话去比较两个对象的地址
- 如果对equals方法进行重写,按照重写的逻辑进行。比如判断值或者即判断值又判断地址。
- 对象的数据类型必须相同:如果要比较的两个对象的数据类型不同,那么它们一定不相等,equals方法会直接返回false。
- 对象的数据类型必须相同:如果要比较的两个对象的数据类型不同,那么它们一定不相等,equals方法会直接返回false。
六、升华
我们平时在调用String、Integer等包装类型时的equals方法时是比较的内容是否一致而不是地址一是否致,如果是地址一致,那所有的String类型比较都是相等的,所以包装类类型都重写了equals方法。我们可以根据业务场景的不同来选择是否重写equals方法。