public boolean equals(Object obj){return (this == obj);
}
原始equals方法是判断两个对象的内存地址是否相等的(内存地址相等,保存的值也相等)
== 比较是判断两个对象的值是否相等(保存的值相等)
在Object类中的equals方法中,默认采用的是==判断两个java对象的内存地址是否相等,
而我们应该判断的是两个java对选哪个的内容是否相等,所以老祖宗的equals方法不够用
因此我们需要对equals进行重写
代码演示:
演示局部变量之间用== 进行判断的时候结果是true
演示实例变量的对象引用的时候用== 进行判断的时候结果是false
/*** @author LBJ* @version V1.0* @Package PACKAGE_NAME* @date 2021/1/28 17:38* @Copyright 公司*//**/
public class Test01{public static void main(String[] args) {int a=100;int b=100;System.out.println(a == b);MyTime myTime1 = new MyTime(2021,2,6);MyTime myTime2 = new MyTime(2021,2,6);System.out.println(myTime1 == myTime2);}}
class MyTime{int year;int month;int day;public MyTime(){}public MyTime(int year,int month,int day){this.year=year;this.month=month;this.day=day;}public String toString(){return this.year+"年"+this.month+"月"+this.day+"日";}}
演示结果:
a和b是局部变量,==判断的是里面的值是否相等
MyTime myTime1和MyTime myTime2里面保存的是对象的引用,也就是说是内存地址,这两个实例化后是不同的内存地址,用==是比较不出来的
import java.util.Objects;/*** @author LBJ* @version V1.0* @Package PACKAGE_NAME* @date 2021/1/28 17:38* @Copyright 公司*//**/
public class Test01{public static void main(String[] args) {int a=100;int b=100;System.out.println(a == b);MyTime myTime1 = new MyTime(2021,2,6);MyTime myTime2 = new MyTime(2021,2,6);System.out.println(myTime1 == myTime2);//重写equals方法之前,比较的是对象内存地址boolean bl = myTime1.equals(myTime2);System.out.println(bl);//重写equals方法之后boolean bl2 = myTime1.equals(myTime2);System.out.println(bl2);//这个程序有bug吗?可以运行,但是效率低,需要进行改造MyTime myTime3 = null;boolean bl3 =myTime1.equals(myTime3);System.out.println(bl3);}}
class MyTime{int year;int month;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 String toString(){
// return this.year+"年"+this.month+"月"+this.day+"日";
// }/*public boolean equals(Object obj){int year1=this.year;int month1=this.month;int day1=this.day;if(obj instanceof MyTime){MyTime t = (MyTime) obj;int year2=t.year;int month2=t.month;int day2=t.day;if(year1==year2&&month1==month2&&day1==day2){return true;}}return false;}//改良后的equals方法public boolean equals(Object obj){//如果obj是空的值,直接返回falseif(obj == null){return false;}//如果obj不是一个Mytime,没有必要比较,直接返回falseif(!(obj instanceof MyTime)){return false;}//若果this和obj保存的内存地址相同,没必要比较了,直接返回trueif(obj == this){return true;}//程序能够执行到此处说明什么?//说明obj不是null,obj是Mytime类型(Object类向Mytime类转型属性向下转型,父类对象转成子类,需要强制转换)MyTime t=(MyTime) obj;if(this.year==t.year&&this.month==t.month&&this.day==t.day){return true;}return false;}*/@Overridepublic String toString() {return "MyTime{" +"year=" + year +", month=" + month +", day=" + day +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;MyTime myTime = (MyTime) o;return year == myTime.year && month == myTime.month && day == myTime.day;}@Overridepublic int hashCode() {return Objects.hash(year, month, day);}
}
java语言中的字符串 String 有没有重写 toString 方法,有没有重写equals方法
String其实是一个类,不属于基本数据类型
既然String是类 那么必须有构造方法
结论:
java中什么类型数据可以使用==判断
答:java中基本数据类型比较是否相等,使用==
java中什么类型的数据需要使用equals判断
答:java中所有的引用数据类型统一使用equals方法判断
演示代码如下:
import java.util.Objects;public class Test01{public static void main(String[] args) {//大部分个情况下,采用这样的方式直接创建字符串String s1="b";String s2="a";System.out.println(s1 == s2);//true//特殊情况,== 判断的是内存地址,不是内容String s3=new String("hello");String s4=new String("hello");System.out.println(s3 == s4);//false//比较两个字符串必须调用equals方法,因为String 类已经重写了equals方法,equals是通用的System.out.println(s3.equals(s4));//ture//String类有没有重写toString方法呢?String x=new String("aaa");//如果String没有重写toString方法,输出结果是java.lang.String@十六进制的地址System.out.println(x.toString());//aaa//经过测试,String类已经重写了toString方法,默认状态x自动调用toStirng方法System.out.println(x);}}
补充:
equals方法重写的时候需要彻底
所有的类如果有带了引用,都需要彻底重写equals方法
import java.util.Objects;/*
equals方法重写的时候需要彻底*/
public class Test01{public static void main(String[] args) {User user=new User("小明",new Address("北京","五环","1234456"));User user2=new User("小明",new Address("北京","五环","1234456"));System.out.println(user.equals(user2));}}class User{//用户名 name保存的是内存地址String name;//用户住址 address保存的也是内存地址,指向Address对象Address address;public User(){}public User(String name, Address address) {this.name = name;this.address = address;}//重写equals方法:当一个用户的用户名和家庭住址都相同,表示同一个用户//这个equals判断的是User对象和User对象是否相等@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;//因为object类里面的o没有这个属性,所以需要强制转换User user = (User) o;//这里面的equals是字符串String重写的equalsreturn Objects.equals(this.name, user.name) && Objects.equals(this.address, user.address);}@Overridepublic int hashCode() {return Objects.hash(name, address);}
}class Address{String city;String street;String zipcode;public Address(){}public Address(String city, String street, String zipcode) {this.city = city;this.street = street;this.zipcode = zipcode;}//注意:这里并没有重写equals方法//这里的equals方法判断的是Address对象和Address对象是否相等@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Address address = (Address) o;return Objects.equals(city, address.city) && Objects.equals(street, address.street) && Objects.equals(zipcode, address.zipcode);}@Overridepublic int hashCode() {return Objects.hash(city, street, zipcode);}
}