首先说一下==和equals之间的区别:
== 如果比较的是基本数据类型 则比较的是其中的值,如果比较的是对象的话,比较的是其中的内存地址,看个案例:
public class MyTime {
private int year;
private int month;
private int day;
public MyTime() {
}
public MyTime(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
}
public class MyTimeTest {
public static void main(String[] args) {
//== 如果比较基本数据类型的话 是比较其值 所以这里是true 10==10
int a =10;
int b =10;
System.out.println(a==b);//true
/**
*比较对象的话 比较的是其内存地址
*明显可以看出 两个对象的内存地址不相等
*/
//test.equals.MyTime@2f0e140b
MyTime myTime1 =new MyTime(2023,7,12);
//test.equals.MyTime@7440e464
MyTime myTime2 =new MyTime(2023,7,12);
System.out.println(myTime1 == myTime2);//false
}
}
可以看出基本数据类型是可以使用==进行判断是否相等,引用数据类型则不能,那应该怎么办呢?
这个时候 我们要使用equals方法进行比较对象是否相等,下面来看看:
public class MyTimeTest {
public static void main(String[] args) {
//== 如果比较基本数据类型的话 是比较其值 所以这里是true 10==10
int a =10;
int b =10;
System.out.println(a==b);//true
/**
*比较对象的话 比较的是其内存地址
*明显可以看出 两个对象的内存地址不相等
*/
//test.equals.MyTime@2f0e140b
MyTime myTime1 =new MyTime(2023,7,12);
//test.equals.MyTime@7440e464
MyTime myTime2 =new MyTime(2023,7,12);
System.out.println(myTime1 == myTime2);//false
//使用equals进行两个对象的比较
System.out.println("猜猜我是什么: "+myTime1.equals(myTime2));//false
}
}
通过测试,使用equals进行对象比较是否相等,发现仍然还是false,使用equals方法也不行吗,这个时候可以看看equals的源码:
public boolean equals(Object obj) {
return (this == obj);
}
可以看出equals的源码还是用==判断两个对象是否相等,显然是不行的,前面说了,如果==比较的是对象的话,比较的是其内存地址,显然创建了两个对象,内存地址明显不相等,那怎么办呢?
这个时候就需要重写equals方法,进行判断了:
package test.equals;
public class MyTime {
private int year;
private int month;
private int day;
public MyTime() {
}
public MyTime(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
@Override
public boolean equals(Object obj) {
//在传递值进来的时候,有可能传递的是null对象进行比较
//同时也有可能传递的类型不是MyTime类,不能进行比较
//所以要使用instanceof关键字判断传递的obj是不是MyTime类
if (obj ==null||!(obj instanceof MyTime) ){
return false;
}
//如果是同一个对象那么一定是相等 例如myTime1.equals(myTime1),不需要判断都是相等的
if (this==obj){
return true;
}
//如果以上都不满足说明其传递的是正确的对象类型
//在这里说明 如果成员变量是包装引用类型使用equals比较值,底层重写了equals
//如果是基本数据类型比较使用==就行
//父类没有MyTime的属性 需要强制类型转换,多态的体现
MyTime myTime = (MyTime) obj;
return this.year == myTime.year && this.month == myTime.month && this.day == myTime.day;
}
}
看图中的注释我相信你应该懂了文章来源:https://www.toymoban.com/news/detail-552329.html
建议以后我们在写类的时候 如果需要使用到equals比较对象其中的值,每个类都可以重写equals方法,因为有些类中也嵌套着另外一个对象类型文章来源地址https://www.toymoban.com/news/detail-552329.html
到了这里,关于带你完全掌握== 和equals区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!