Java基礎(chǔ)之equals方法

1、關(guān)于equals方法

equals方法是基類Object中的方法岛马,因此對(duì)于所有的繼承于Object的類都會(huì)有該方法索烹。為了更直觀地理解equals方法的作用,直接看Object類中equals方法的實(shí)現(xiàn)臭埋。該方法定義在Object類中踪央,其源碼如下:

/**
*Object.class
*/
public boolean equals(Object obj) {
        return this == obj;
    }

很顯然,在Object類中瓢阴,equals方法是用來(lái)比較兩個(gè)對(duì)象的引用是否相等畅蹂,即是否指向同一個(gè)對(duì)象。

2荣恐、關(guān)于字符串的比較

先看如下代碼:

public class Main { 
    public static void main(String[] args) {
        String str1 = "abcd";//line 1
        String str2 = new String(str1);// line 2
        String str3 = "abcd";//line 3
        String str4 = new String("abcd"); //line 4
        String str5 = str1;//line 5
        str5 = str5.concat("ef");//line 6
        System.out.println(str1==str3);        
        System.out.println(str1==str2);              
        System.out.println(str2==str4);        
        System.out.println(str1==str5);
        System.out.println(str1.equals(str3));
        System.out.println(str1.equals(str2)); 
        System.out.println(str2.equals(str4));
        System.out.println(str1.equals(str5));
    }
}

由上一篇博客Java基礎(chǔ)之String可知后四行的打印結(jié)果為:true,true,true,fasle,對(duì)于最后一個(gè)false結(jié)果比較容易理解液斜,str1的字符串內(nèi)容為“adcd”,str5的內(nèi)容為“abcdef”,兩者顯然不相同,故結(jié)果為false,而對(duì)于前三個(gè)結(jié)果叠穆,又該如何解釋呢少漆?
先看String類源碼中的equals方法:

/**
*String.class
*/
public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj instanceof String) {
            String s = (String) obj;
            int i = value.length;
            if (i == s.value.length) {
                char ac[] = value;
                char ac1[] = s.value;
                for (int j = 0; i-- != 0; j++)
                    if (ac[j] != ac1[j])
                        return false;
                return true;
            }
        }
        return false;
    }

看到這里我們應(yīng)該明白了,原來(lái)String類對(duì)equals方法進(jìn)行了覆寫(xiě)痹束,用來(lái)比較指向的字符串對(duì)象所存儲(chǔ)的字符串是否相等检疫,從String類的equals方法可知,在equals方法中先進(jìn)行引用對(duì)象的比較祷嘶,如果兩者指向的內(nèi)存空間相同屎媳,及兩者指向的為同一內(nèi)存空間夺溢,字符串內(nèi)容一定相同,直接返回true烛谊,如果兩者指向的內(nèi)存空間不同风响,在進(jìn)行字符串內(nèi)容的比較,如果內(nèi)容完全相同丹禀,直接返回true,否則返回false状勤。

3、關(guān)于其他類型

其他的一些類諸如Double双泪,Date持搜,Integer等,都對(duì)equals方法進(jìn)行了重寫(xiě)用來(lái)比較指向的對(duì)象所存儲(chǔ)的內(nèi)容是否相等焙矛。

4葫盼、關(guān)于關(guān)系操作符“==”

關(guān)于關(guān)系操作符“==”在《Java編程思想》中有這樣一句描述:
關(guān)系操作符生成的是一個(gè)boolean結(jié)果,它們計(jì)算的是操作數(shù)的值之間的關(guān)系
先看如下代碼:

public class Main { 
    /**
     * @param args
     */
    public static void main(String[] args) {
        int m=3; 
        int n=3;      
        System.out.println(m==n); 
        String str = new String("hello");
        String str1 = new String("hello");
        String str2 = new String("hello"); 
        System.out.println(str1==str2); 
        str1 = str;
        str2 = str;
        System.out.println(str1==str2);
    } 
}

輸出結(jié)果為 true false true;

  • 對(duì)于基本數(shù)據(jù)類型的變量村斟,變量直接存儲(chǔ)的是“值”贫导,因此在用關(guān)系操作符==來(lái)進(jìn)行比較時(shí),比較的就是 “值” 本身蟆盹。
  • 對(duì)于引用數(shù)據(jù)類型的變量孩灯,變量存儲(chǔ)的是關(guān)聯(lián)的對(duì)象在內(nèi)存中的地址,str,str1,str2分別指向了一個(gè)String對(duì)象逾滥,此時(shí)str,str1,str2成為對(duì)象的引用峰档,變量str,str1,str2中存儲(chǔ)的是它們指向的對(duì)象在堆內(nèi)存中的地址,并不是對(duì)象的“值”本身匣距,也就是說(shuō)并不是直接存儲(chǔ)的字符串”hello”面哥。因此在用==對(duì)str1和str2進(jìn)行第一次比較時(shí),得到的結(jié)果是false毅待。因此它們分別指向的是不同的對(duì)象,也就是說(shuō)它們實(shí)際存儲(chǔ)的內(nèi)存地址不同归榕。
    而在第二次比較時(shí)尸红,都讓str1和str2指向了str指向的對(duì)象,那么得到的結(jié)果毫無(wú)疑問(wèn)是true刹泄。

5外里、總結(jié)

  • 對(duì)于==,如果作用于基本數(shù)據(jù)類型的變量特石,則直接比較其存儲(chǔ)的 “值”是否相等盅蝗;如果作用于引用類型的變量,則比較的是所指向的對(duì)象的地址;
  • 對(duì)于equals方法姆蘸,注意:equals方法不能作用于基本數(shù)據(jù)類型的變量,如果沒(méi)有對(duì)equals方法進(jìn)行重寫(xiě)墩莫,則比較的是引用類型的變量所指向的對(duì)象的地址芙委;諸如String、Date等類對(duì)equals方法進(jìn)行了重寫(xiě)的話狂秦,比較的是所指向的對(duì)象的內(nèi)容灌侣。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市裂问,隨后出現(xiàn)的幾起案子侧啼,更是在濱河造成了極大的恐慌,老刑警劉巖堪簿,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痊乾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡椭更,警方通過(guò)查閱死者的電腦和手機(jī)符喝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)甜孤,“玉大人协饲,你說(shuō)我怎么就攤上這事〗纱ǎ” “怎么了茉稠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)把夸。 經(jīng)常有香客問(wèn)我而线,道長(zhǎng),這世上最難降的妖魔是什么恋日? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任膀篮,我火速辦了婚禮,結(jié)果婚禮上岂膳,老公的妹妹穿的比我還像新娘誓竿。我一直安慰自己,他們只是感情好谈截,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布筷屡。 她就那樣靜靜地躺著,像睡著了一般簸喂。 火紅的嫁衣襯著肌膚如雪毙死。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天喻鳄,我揣著相機(jī)與錄音扼倘,去河邊找鬼。 笑死除呵,一個(gè)胖子當(dāng)著我的面吹牛再菊,可吹牛的內(nèi)容都是我干的爪喘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼袄简,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼腥放!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起绿语,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秃症,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后吕粹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體种柑,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年匹耕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了聚请。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稳其,死狀恐怖驶赏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情既鞠,我是刑警寧澤煤傍,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站嘱蛋,受9級(jí)特大地震影響蚯姆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洒敏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一龄恋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凶伙,春花似錦郭毕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至偏竟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間敞峭,已是汗流浹背踊谋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旋讹,地道東北人殖蚕。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓轿衔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親睦疫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子害驹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容