JAVA进阶教学之(Object类中的equals方法)
?
?
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);} }?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的JAVA进阶教学之(Object类中的equals方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装redis提示[test] erro
- 下一篇: 台式电脑耳机插孔在哪_一图教你学会电脑主