Java中"=="和equals的區(qū)別


原文鏈接:
Java中equlas和==的區(qū)別
參考鏈接:
Object


正文

Java中的數(shù)據(jù)類型可以分為兩類:
1哺呜、基本數(shù)據(jù)類型匣砖,也稱原始數(shù)據(jù)類型。byte,short,char,int,long,float,double,boolean查描。
2痴鳄、復合數(shù)據(jù)類型(類)。


1县貌、==

在Java中术陶,當我們用"=="比較數(shù)據(jù)時,對于基本類型煤痕,我們比較的是他們的梧宫。而對于復合數(shù)據(jù)類型,我們比較的是他們在內(nèi)存中的存放地址摆碉。

例子

public class JavaStudyTest {
    
    public static void main(String[] args) {
        int i1 = 1;
        int i2 = 1;
        String str1 = new String("str");
        String str2 = new String("str");
        
        System.out.println("i1 == i2 ? " + ( i1 == i2 ));
        System.out.println("str1 == str2 ? " + ( str1 == str2 ));
    }
    
}

在上面的代碼中塘匣,我們創(chuàng)建了兩個int變量i1和i2,給它們的賦值都為1巷帝,有創(chuàng)建了兩個String對象str1和str2忌卤,字符串的內(nèi)容都為"str"。當我們用"=="比較i1和i2,str1和str2時楞泼,輸出結果如下:


"=="結果

可以看到驰徊,“==”判斷“i1==i2”的結果是true历谍,因為i1和i2為基本類型,所以“==”比較的是它們的值辣垒,而它們的值都為1望侈。
“==”判斷“str1==str2”的結果是false,雖然str1和str2內(nèi)容都為"str"勋桶,但是我們使用new創(chuàng)建的是兩個對象脱衙,內(nèi)存分配給他們的地址是不同的,對于非基本類型例驹,"=="比較的是他們的地址捐韩。



2、equals

Java中所有的類都是繼承于Object這個基類的鹃锈,在Object中定義了一個equals方法荤胁,源碼如下:

public boolean equals(Object obj) {
        return (this == obj);
    }

可以看到,在Object類中屎债,equals方法本質(zhì)用的還是"=="對數(shù)據(jù)進行比較仅政,但是在一些類庫中,equals方法被覆蓋掉了盆驹,如String,Integer,Date在這些類中圆丹,equals有其自身的實現(xiàn),而不是比較對象在堆內(nèi)存中的存放地址了躯喇。

下面我們看看關于String類的equals方法:

public class JavaStudyTest {
    
    public static void main(String[] args) {
        
        String str1 = new String("str");
        String str2 = new String("str");
        
        System.out.println("str1 == str2 ? " + ( str1 == str2 ));
        System.out.println("str1 equals str2 ? " + ( str1.equals(str2)));
    }
    
}

輸出結果:


String比較結果

可以看出辫封,String類的equals方法比較的不是String對象的存放地址了。


3廉丽、字符串緩沖池

先看一個例子:


public class JavaStudyTest {
    
    public static void main(String[] args) {
        
        String str1 = new String("str");
        String str2 = new String("str");
        String str3 = "abc";
        String str4 = "abc";
        
        System.out.println("str1 == str2 ? " + ( str1 == str2 ));
        System.out.println("str1 equals str2 ? " + ( str1.equals(str2)));
        System.out.println("str3 == str4 ? " + ( str3 == str4 ) );
        System.out.println("str3 equals str4 ? " + (str3.equals(str4)));
    }
    
}

再看輸出結果:


輸出結果

可以看到倦微,"str3==str4"結果為true,這是為什么呢正压?
程序在運行的時候欣福,會創(chuàng)建一個字符串緩沖池。當我們使用str3 = "abc"這樣的表達式來創(chuàng)建字符串時蔑匣,程序首先會在String緩沖池中尋找相同值的對象劣欢,所以,在str3 = "abc"創(chuàng)建字符串時裁良,"abc"這個字符串先被放到了緩沖池中凿将,當創(chuàng)建str4時,程序在緩沖池中尋找到了具有相同值的str3价脾,于是將str4引用指向str3所引用的"abc"對象牧抵。
而當我們使用new表達式創(chuàng)建String對象時,表明我們是需要創(chuàng)建新的對象,于是就會在堆中為我們創(chuàng)建新的String對象犀变,不會引用舊的對象妹孙。

我們再看看一個特殊的例子:

public class JavaStudyTest {
    
    public static void main(String[] args) {
        
        String str1 = "abc";
        String str2 = new String("abc");
        String str3 = str2.intern();
        
        System.out.println("str1 == str3 ? " + ( str1 == str3 ));
    }
    
}

再看看比較結果:


圖片.png
圖片.png

為什么結果為true呢,因為雖然String的intern方法的返回值還是字符串获枝,比如"abc".intern返回的還是字符串"abc"蠢正,但是實際上,在返回"abc"字符串時省店,它先檢查緩沖池中是否存在"abc"字符串嚣崭,如果存在,就返回池中的字符串懦傍;如果不存在雹舀,該方法就將"abc"添加到池中,再返回池中的它的引用粗俱。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末说榆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子寸认,更是在濱河造成了極大的恐慌签财,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件废麻,死亡現(xiàn)場離奇詭異荠卷,居然都是意外死亡模庐,警方通過查閱死者的電腦和手機烛愧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掂碱,“玉大人怜姿,你說我怎么就攤上這事√墼铮” “怎么了沧卢?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長醉者。 經(jīng)常有香客問我但狭,道長,這世上最難降的妖魔是什么撬即? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任立磁,我火速辦了婚禮,結果婚禮上剥槐,老公的妹妹穿的比我還像新娘唱歧。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布颅崩。 她就那樣靜靜地躺著几于,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沿后。 梳的紋絲不亂的頭發(fā)上沿彭,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音尖滚,去河邊找鬼膝蜈。 笑死,一個胖子當著我的面吹牛熔掺,可吹牛的內(nèi)容都是我干的饱搏。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼置逻,長吁一口氣:“原來是場噩夢啊……” “哼推沸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起券坞,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤鬓催,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恨锚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宇驾,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年猴伶,在試婚紗的時候發(fā)現(xiàn)自己被綠了课舍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡他挎,死狀恐怖筝尾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情办桨,我是刑警寧澤筹淫,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站呢撞,受9級特大地震影響损姜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜殊霞,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一摧阅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脓鹃,春花似錦逸尖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岩齿。三九已至,卻和暖如春苞俘,著一層夾襖步出監(jiān)牢的瞬間盹沈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工吃谣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乞封,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓岗憋,卻偏偏與公主長得像肃晚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仔戈,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

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