詳解java==運(yùn)算符和equals()方法的區(qū)別
Java語(yǔ)言程序中判斷兩個(gè)變量是否相等有兩種方式:一是運(yùn)用==運(yùn)算符,二是運(yùn)用equals方法。
1. ==運(yùn)算符
對(duì)于==運(yùn)算符來(lái)說(shuō),如果兩個(gè)變量是基本類型的,并且是數(shù)值類型,則只要它們的值相等,就會(huì)返回true;然而如果是兩個(gè)引用類型的變量,則分為兩種情況:1)它們指向同一個(gè)對(duì)象,結(jié)果返回true;2)它們指向不同的對(duì)象,即使對(duì)象內(nèi)容相同,結(jié)果還是返回false;下面程序示范了使用==運(yùn)算符比較兩個(gè)變量是否相等的結(jié)果:
public class Test {
public static void main(String[] args) {
int a = 5;
int b = 5;
String s1 = "helloJava";
String s2 = "helloJava";
String s3 = "hello"+"Java";
String s4 = "hello";
String s5 = "Java";
String s6 = s4 + s5;
String s7 = new String("helloJava");
System.out.println("a==b?: "+(a==b));
System.out.println("s1==s2?: "+(s1==s2));
System.out.println("s1==s3?: "+(s1==s3));
System.out.println("s1==s6?: "+(s1==s6));
System.out.println("s1==s7?: "+(s1==s7));
System.out.println("s1.equals(s6)?: "+(s1.equals(s6)));
System.out.println("s1.equals(s7)?: "+(s1.equals(s7)));
}
}
運(yùn)行結(jié)果為:
a==b?: true
s1==s2?: true
s1==s3?: true
s1==s6?: false
s1==s7?: false
s1.equals(s6)?: true
s1.equals(s7)?: true
結(jié)果分析:兩個(gè)int類型的a和b相等,不需要多解釋;s1、s2和s3所引用的字符串在編譯期間就已經(jīng)確定下來(lái),因此它們都將引用常量池中的同一個(gè)字符串對(duì)象;s6對(duì)應(yīng)的字符串值不能在編譯期間確定下來(lái);s7使用new構(gòu)造器將會(huì)創(chuàng)建一個(gè)新的String對(duì)象,s7引用堆內(nèi)存中創(chuàng)建的String對(duì)象,不在常量池中。(關(guān)于String字符串的創(chuàng)建和存儲(chǔ)機(jī)制將在下篇介紹,望大家置頂公眾號(hào),第一時(shí)間收看)。
2. equals()方法
equals()方法是Object類提供的一個(gè)方法,直接使用這個(gè)方法判斷兩個(gè)對(duì)象相等的標(biāo)準(zhǔn)與使用==運(yùn)算符沒(méi)有區(qū)別,但是怎么樣實(shí)現(xiàn)類似于“值相等”的判斷規(guī)則呢?答案是重寫equals方法。
String已經(jīng)重寫了Object的equals()方法,String的equals()方法判斷兩個(gè)字符串相等的標(biāo)準(zhǔn)是:如果兩個(gè)字符串所包含的字符序列相等,通過(guò)equals()方法比較將返回true,否則返回false。
一般而言,重寫equals()方法應(yīng)該滿足下列條件:
1)自反性:對(duì)任意x,x.equals(x)一定返回true。
2)對(duì)稱性:對(duì)任意x,y,如果x.equals(y)返回true,則y.equals(x)也一定返回true。
3)傳遞性:對(duì)任意x,y,z,如果x.equals(y)返回true,y.equals(z)也返回true,則x.equals(z)也一定返回true。
4)一致性:對(duì)任意x,y,如果對(duì)象中用于比較的信息沒(méi)有改變,那么無(wú)論調(diào)用多少次x.equals(y),返回的結(jié)果應(yīng)該保持一致,要么一直返回true,要么一直返回false。
5)對(duì)任意不是null的x,x.equals(null)一定返回false。
實(shí)際應(yīng)用中常常需要根據(jù)業(yè)務(wù)本身重寫equals()方法,equals()方法的實(shí)現(xiàn)也是由業(yè)務(wù)決定的,下面示范了一種符合實(shí)際情況的重寫equals()方法的示例:
public class Person {
private String name;//姓名
private int age;//年齡
private String idNum;//身份證號(hào)
public Person() {
super();
}
public Person(String name, int age, String idNum) {
super();
this.name = name;
this.age = age;
this.idNum = idNum;
}
//重寫equals方法
public boolean equals(Object obj){
//如果兩個(gè)對(duì)象是同一個(gè)對(duì)象,返回true
if(this == obj){
return true;
}
//obj是Person對(duì)象
if(obj!=null && obj.getClass()==Person.class){
Person p = (Person)obj;
//并且身份證號(hào)相同才判斷兩個(gè)對(duì)象相等
if(this.idNum.equals(p.getIdNum())){
return true;
}
}
return false;
}
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 String getIdNum() {
return idNum;
}
public void setIdNum(String idNum) {
this.idNum = idNum;
}
public static void main(String[] args) {
Person p1 = new Person("張三", 14, "zs14abc");
Person p2 = new Person("張三2", 15, "zs14abc");
Person p3 = new Person("張三", 14, "zs14abc2");
System.out.println("p1.equals(p2)?: "+(p1.equals(p2)));
System.out.println("p1.equals(p3)?: "+(p1.equals(p3)));
}
}
運(yùn)行結(jié)果:
p1.equals(p2)?: true
p1.equals(p3)?: false
大家都明白了==和equals的區(qū)別和用法了嗎?網(wǎng)上很多說(shuō)equals()方法是判斷兩個(gè)對(duì)象的值相等,這個(gè)說(shuō)法并不太準(zhǔn)確,因?yàn)槟憧梢灾貙慹quals()方法,你想讓它們?cè)趺聪嗟染驮趺聪嗟?,在極端情況下你可以讓Person對(duì)象個(gè)Pig對(duì)象相等。
所以為了便于初學(xué)者記憶,可以說(shuō)==運(yùn)算符用來(lái)比較兩個(gè)變量的值是否相等;equals()方法用于比較兩個(gè)對(duì)象的內(nèi)容是否相同。
以上所述是小編給大家介紹的java==運(yùn)算符和equals()方法的區(qū)別詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Java equals()方法使用詳解及總結(jié)
- Java中==符號(hào)與equals()的使用詳解(測(cè)試兩個(gè)變量是否相等)
- 詳解Java中==和equals()的區(qū)別
- Java中==和equals()的區(qū)別總結(jié)
- Java中equals()方法實(shí)例詳解
- Java中equals()方法重寫實(shí)現(xiàn)代碼
- 詳解Java中“==”與equals()的區(qū)別
- Java中的== 和equals()方法詳解與實(shí)例
- Java自定義實(shí)現(xiàn)equals()方法過(guò)程解析
- Java中equals()方法的理解與使用方法例子
相關(guān)文章
MyBatis使用級(jí)聯(lián)操作解決lombok構(gòu)造方法識(shí)別失敗問(wèn)題
這篇文章主要介紹了MyBatis使用級(jí)聯(lián)操作解決lombok構(gòu)造方法識(shí)別失敗問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Java中連接數(shù)據(jù)庫(kù)方式詳細(xì)步驟記錄
這篇文章主要介紹了Java中連接數(shù)據(jù)庫(kù)方式的詳細(xì)步驟,包括添加依賴、建立連接、執(zhí)行SQL語(yǔ)句、處理結(jié)果集和關(guān)閉連接,還討論了數(shù)據(jù)庫(kù)連接池的使用,需要的朋友可以參考下2025-01-01
java版飛機(jī)大戰(zhàn)實(shí)戰(zhàn)項(xiàng)目詳細(xì)步驟
這篇文章主要為大家詳細(xì)介紹了java版飛機(jī)大戰(zhàn)實(shí)戰(zhàn)項(xiàng)目詳細(xì)步驟,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
Java應(yīng)用程序開(kāi)發(fā)學(xué)習(xí)之static關(guān)鍵字應(yīng)用
今天小編就為大家分享一篇關(guān)于Java應(yīng)用程序開(kāi)發(fā)學(xué)習(xí)之static關(guān)鍵字應(yīng)用,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
java使用BeanUtils.copyProperties踩坑經(jīng)歷
最近在做個(gè)項(xiàng)目,踩了個(gè)坑特此記錄一下,本文主要介紹了使用BeanUtils.copyProperties踩坑經(jīng)歷,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
SpringSecurity構(gòu)建基于JWT的登錄認(rèn)證實(shí)現(xiàn)
這篇文章主要介紹了SpringSecurity構(gòu)建基于JWT的登錄認(rèn)證實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02

