Java中equals方法使用及重寫練習(xí)
一、"=="運(yùn)算符
"=="是一個(gè)比較運(yùn)算符。
- "=="既可以判斷基本類型,又可以判斷引用類型。
- "=="如果判斷基本類型,判斷的是值是否相等。eg: int i=10; double d=10.0
- "=="如果判斷引用類型,判斷的是地址是否相等,即判定是不是同一個(gè)對象。
二、equals方法
- equals是object類中的方法,只能用于判斷引用類型。
- equals方法默認(rèn)判斷的是地址是否相等,子類中往往重寫該方法,用于判斷內(nèi)容是否相等。比如String和Integer類中的equals源代碼。
Object類中的equals方法的源碼:
Object類中的equals方法默認(rèn)就是比較對象地址是否相同。
public boolean equals(Object obj) {
return (this == obj);
}"hello".equals("abc");
解釋:this指的就是當(dāng)前對象,this是指equals方法是誰調(diào)用的,上面的hello調(diào)用的equals,所以this指的是字符串hello,而==右邊的obj對象,是傳入的abc。
三、重寫equals方法練習(xí)
練習(xí)一:
package object;
/*
判斷兩個(gè)person對象的內(nèi)容是否相等
如果兩個(gè)person對象的各個(gè)屬性值都一樣,則返回true,反之返回false
*/
public class EqualsExercise {
public static void main(String[] args) {
Person person1 = new Person("jack", 10, '男');
Person person2 = new Person("jack", 10, '男');
System.out.println(person1.equals(person2)); //輸出結(jié)果是true
}
}
class Person {
private String name;
private int age;
private char gender;
//重寫Object的equals方法
public boolean equals(Object obj) {
//如果比較的兩個(gè)對象是同一個(gè)對象,則直接返回true
if (this == obj){ //this就代表調(diào)用equals方法的那個(gè)對象,obj就是方法里面的實(shí)參
return true;
}
//類型判斷
if (obj instanceof Person){ //obj是Person,我們才比較
//進(jìn)行 向下轉(zhuǎn)型(即obj轉(zhuǎn)成Person); 因?yàn)槲倚枰玫給bj的各個(gè)屬性,如果不轉(zhuǎn)型,拿不到
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender;
}
//如果不是person,則直接返回false;總不能拿一個(gè)人跟一個(gè)狗比
return false;
}
public Person(String name, int age, char gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
}Tips:
instanceof的用法:result = object instanceof class
instanceof左邊是對象,右邊是類;當(dāng)對象是右邊類或子類所創(chuàng)建對象時(shí),返回true;否則,返false。
練習(xí)二:

解釋:
- sout1:p1和p2都是對象,因此==判斷的是地址是否相同,false
- sout2:p1.name和p2.name都是字符串,因此這里的equals調(diào)用的是String類的中的equals方法,判斷的是內(nèi)容是否相同,true
- sout3:p1和p2都是對象,因此這里的equals是Object類中的equals方法,判斷的是地址是否相同,false
- sout4:s1和s2都是String類的對象,因此這里的equals調(diào)用的是String類的中的equals方法,判斷的是內(nèi)容是否相同,true
- sout5:s1和s2都是對象,因此==判斷的是地址是否相同,false
練習(xí)三:

解釋:
- sout1:65和65.0是相等的,true
- sout2:字符的本質(zhì)還是數(shù)字,查閱AscII表,A就是12,true
- sout3:沒啥說的
- sout4:沒啥說的
- sout5:沒啥說的
- sout6:都不是同一種類型,==直接編譯錯(cuò)誤
補(bǔ)充:在Java中比較的推薦方法
所以我們一般比較基本數(shù)據(jù)類型的時(shí)候,使用"==",例如 int i = 0; if (i == 1){…},比較兩個(gè)Integer包裝類類型的時(shí)候就可以使用equals(),因?yàn)镴ava已經(jīng)重寫了equals()方法了。另外給出幾點(diǎn)建議,在java中進(jìn)行比較,我們需要根據(jù)比較的類型來選擇合適的比較方式:
- 對象域,使用equals方法 。
- 類型安全的枚舉,使用equals或== 。
- 可能為null的對象域 : 使用==null 和 equals 。
- 數(shù)組域 : 使用 Arrays.equals 。
- 除float和double外的原始數(shù)據(jù)類型(int,byte等) : 使用 == 。
- float類型: 使用Float.foatToIntBits轉(zhuǎn)換成int類型,然后使用==。
- double類型: 使用Double.doubleToLongBit轉(zhuǎn)換成long類型,然后使用==。
其中6,7參考java中的對應(yīng)的包裝類實(shí)現(xiàn):
public boolean equals(Object obj) {
return (obj instanceof Float)
&& (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}
}為什么要在我們自己的類中重寫equals()
但是有時(shí)候我們不滿足于使用基本數(shù)據(jù)類型和Java實(shí)現(xiàn)的一些繼承自O(shè)bject的哪些類,比如我們實(shí)現(xiàn)一個(gè)Person類,它是繼承自O(shè)bject類的,所以它的equals()方法默認(rèn)使用的是文章開頭提到的哪個(gè)equals()方法,當(dāng)我們使用equals()進(jìn)行比較的時(shí)候,比較內(nèi)存地址,那么有可能出現(xiàn)兩個(gè)Person對象的參數(shù)都相同(比如年齡,身份證號等,在我們的實(shí)際認(rèn)知中認(rèn)為這兩個(gè)人就是一個(gè)人,應(yīng)該返回true),但是由于他們的內(nèi)存地址是不一樣的,所以equals()方法會(huì)返回false。
那么我們就需要去重寫equals()方法。
總結(jié)
到此這篇關(guān)于Java中equals方法使用及重寫練習(xí)的文章就介紹到這了,更多相關(guān)Java中equals方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SWT(JFace)體驗(yàn)之StackLayout布局
SWT(JFace)體驗(yàn)之StackLayout布局實(shí)現(xiàn)代碼。2009-06-06
從SpringBoot打war包并配置外部Tomcat運(yùn)行的全流程
由于其他原因,我們需要使用SpringBoot打成war包放在外部的Tomcat中運(yùn)行,本文就以一個(gè)案例來說明從SpringBoot打war包到Tomcat配置并運(yùn)行的全流程經(jīng)過,需要的朋友可以參考下2024-06-06
idea項(xiàng)目文件夾橫向顯示,縱向顯示的解決方法
這篇文章主要介紹了idea項(xiàng)目文件夾橫向顯示,縱向顯示的解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
Java 實(shí)現(xiàn)加密數(shù)據(jù)庫連接的步驟
這篇文章主要介紹了Java 實(shí)現(xiàn)加密數(shù)據(jù)庫連接的步驟,幫助大家更好的理解和使用Java處理數(shù)據(jù)庫,感興趣的朋友可以了解下2020-11-11
SpringBoot后端數(shù)據(jù)校驗(yàn)實(shí)戰(zhàn)操作指南
在項(xiàng)?開發(fā)中,對于前端提交的表單,后臺(tái)接?接收到表單數(shù)據(jù)后,為了保證程序的嚴(yán)謹(jǐn)性,通常后端會(huì)加?業(yè)務(wù)參數(shù)的合法校驗(yàn)操作來避免程序的?技術(shù)性?bug,這篇文章主要給大家介紹了關(guān)于SpringBoot后端數(shù)據(jù)校驗(yàn)的相關(guān)資料,需要的朋友可以參考下2022-07-07
SpringMVC請求、響應(yīng)和攔截器的使用實(shí)例詳解
攔截器(Interceptor) 它是一個(gè)Spring組件,并由Spring容器管理,并不依賴Tomcat等容器,是可以單獨(dú)使用的,這篇文章給大家介紹SpringMVC請求、響應(yīng)和攔截器的使用,感興趣的朋友一起看看吧2024-03-03
SpringBoot項(xiàng)目中Controller接收兩個(gè)實(shí)體的實(shí)現(xiàn)方法
本文主要介紹了SpringBoot項(xiàng)目中Controller接收兩個(gè)實(shí)體的實(shí)現(xiàn)方法,主要介紹了兩種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08

