Java中equals方法和==的区别
1、 数据类型
1.1 基本类型
基本类型 是Java中预定义的类型,有相应的保留关键字来表示,具有明确的取值范围和数学行为,表示了真实的数字、字符和整数。基本类型的数据都是单个值,而不是复杂的对象,所以基本类型并不是面向对象的,这主要是出于效率方面的考虑。但是同时Java中也为基本类型提供了对应的对象版本,即基本类型的包装类(wrapper)。我们可以直接使用这些基本类型,也可以使用基本类型的构造数组或者其他自定义类型。1
Java提供了八种基本数据类型,其中有六种数字类型,一种字符类型和一种布尔型。2
详细数据如下表:3
类型 | 大小 | 数据范围 |
---|---|---|
byte | 1字节(8位) | [-27, 27-1] |
short | 2字节(16位) | [-215, 215-1] |
int | 4字节(32位) | [-231, 231-1] |
long | 8字节(64位) | [-263, 263-1] |
float | 4字节(32位) | [-3.4*1038, 3.4*1038] |
double | 8字节(64位) | [-1.8*10308, 1.8*10308-1] |
char | 2字节(16位) | [\u0000, \uffff] |
boolean | Java规范没有明确的规定,不同的JVM有不同的实现机制 |
1.2 引用类型
引用类型中的引用,一般是指某个对象的内存地址,其中对象是动态创建的类实例或者动态创建的数组,另外Java语言本身不支持C++中的结构体(struct) 或联合体(union) 等数据类型,这种复合数据类型一般都是通过类或接口进行构造。1
2、比较方式
2.1 == 的比较方式
如果两个比较对象均为基本类型,侧比较的是数值是否相等。
如果两个比较对象均为引用类型,比较的是两者的地址是否相同。4
2.2 equals()的比较方式
没有重写equals()时,Object默认以==来实现,即比较两个对象的内存地址是否相同。4
但是对于对象来说,我们关注的其实是对象的内容是否相同,所以我们可以通过重写equals()来将比较转换为我们想要的结果,比如只比较两个对象的成员变量的值是否相同。
3、重写equals()
我们只需要在定义类时重写equals()方法即可。 比如现在我有一个学生类student
class Student{
private String id; //学号,所有学生学号唯一
private String name; //姓名
private String age; //年龄
}
我的需求是判断某两个类描述的是否是同一个学生。我可以直接判断学生的学号是否相同即可,若学号相同则为同一个学生。那么在实现成员变量的get/set方法后,我可以这么重写equals()方法
@Override
public boolean equals(Object obj) {
// 比较的类是否就是自己
if(this==obj){
return true;
}
// 比较的类的类型是否是Student的实例
if(obj instanceof Student){
Student student = (Student)obj;
// 返回id的比较结果
return this.id.equals(student.getId());
}
return false;
}
其中,我也使用了String的equals()方法,我们可以从String类的源码中找到相关的代码,如下
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;
}
值得注意的是,String类在java9版本中从char类型实现改为byte类型实现5,以此来节约String占用的内存。很明显以上代码中的String类是用char类型实现的。
4、总结
=
=
==
==有两种比较方式,比较基本类型的数值和比较引用类的地址。
equals()方法默认是以
=
=
==
==来实现,我们也可以在平常的需求中重写equals()方法。