==和equals的區(qū)別

==:

==是直接比較的兩個(gè)對(duì)象的堆內(nèi)存地址劝赔,如果相等豌骏,則說(shuō)明這兩個(gè)引用實(shí)際是指向同一個(gè)對(duì)象地址的琅翻。但是我們又常常碰到這樣一個(gè)問(wèn)題:


image.png

最終結(jié)果是 true,true晒杈,false嫂伞,那既然==是比較的地址,那么int數(shù)據(jù)的地址是怎樣的呢桐智,String又是怎樣的呢末早?

對(duì)于基本數(shù)據(jù)類型(byte,short说庭,char然磷,int,float刊驴,double姿搜,long寡润,boolean)來(lái)說(shuō),他們是作為常量在方法區(qū)中的常量池里面以HashSet策略存儲(chǔ)起來(lái)的舅柜,對(duì)于這樣的字符串 "123" 也是相同的道理梭纹,在常量池中,一個(gè)常量只會(huì)對(duì)應(yīng)一個(gè)地址致份,因此不管是再多的 123,"123" 這樣的數(shù)據(jù)都只會(huì)存儲(chǔ)一個(gè)地址变抽,所以所有他們的引用都是指向的同一塊地址,因此基本數(shù)據(jù)類型和String常量是可以直接通過(guò)==來(lái)直接比較的氮块。其實(shí)常量池是為了避免頻繁的創(chuàng)建和銷毀對(duì)象而影響系統(tǒng)性能绍载,其實(shí)現(xiàn)了對(duì)象的共享。
例如字符串常量池滔蝉,在編譯階段就把所有的字符串文字放到一個(gè)常量池中击儡。
(1)節(jié)省內(nèi)存空間:常量池中所有相同的字符串常量被合并,只占用一個(gè)空間蝠引。
(2)節(jié)省運(yùn)行時(shí)間:比較字符串時(shí)阳谍,==比equals()快。對(duì)于兩個(gè)引用變量螃概,只用==判斷引用是否相等矫夯,也就可以判斷實(shí)際值是否相等。

下面再舉一個(gè)例子:


        String s1 = "Hello";
        String s2 = "Hello";
        String s3 = "Hel" + "lo";
        String s4 = "Hel" + new String("lo");
        String s5 = new String("Hello");
        String s7 = "H";
        String s8 = "ello";
        String s9 = s7 + s8;
        System.out.println(s1 == s2);  // true
        System.out.println(s1 == s3);  // true
        System.out.println(s1 == s4);  // false
        System.out.println(s1 == s9);  // false
        System.out.println(s4 == s5);  // false

1.s1 == s2這個(gè)非常好理解谅年,s1茧痒、s2在賦值時(shí),均使用的字符串字面量融蹂,說(shuō)白話點(diǎn)旺订,就是直接把字符串寫死,在編譯期間超燃,這種字面量會(huì)直接放入class文件的常量池中区拳,從而實(shí)現(xiàn)復(fù)用,載入運(yùn)行時(shí)常量池后意乓,s1樱调、s2指向的是同一個(gè)內(nèi)存地址,所以相等届良。

2.s1 == s3這個(gè)地方有個(gè)坑笆凌,s3雖然是動(dòng)態(tài)拼接出來(lái)的字符串,但是所有參與拼接的部分都是已知的字面量士葫,在編譯期間乞而,這種拼接會(huì)被優(yōu)化,編譯器直接幫你拼好慢显,因此String s3 = "Hel" + "lo";在class文件中被優(yōu)化成String s3 = "Hello"爪模,所以s1 == s3成立欠啤。只有使用引號(hào)包含文本的方式創(chuàng)建的String對(duì)象之間使用“+”連接產(chǎn)生的新對(duì)象才會(huì)被加入字符串池中。

3.s1 == s4當(dāng)然不相等屋灌,s4雖然也是拼接出來(lái)的洁段,但new String("lo")這部分不是已知字面量,是一個(gè)不可預(yù)料的部分共郭,編譯器不會(huì)優(yōu)化祠丝,必須等到運(yùn)行時(shí)才可以確定結(jié)果,結(jié)合字符串不變定理落塑,鬼知道s4被分配到哪去了纽疟,所以地址肯定不同。對(duì)于所有包含new方式新建對(duì)象(包括null)的“+”連接表達(dá)式憾赁,它所產(chǎn)生的新對(duì)象都不會(huì)被加入字符串池中。

而在某些特別情況下散吵, String 對(duì)象的字符串拼接其實(shí)是被 JVM 解釋成了 StringBuffer 對(duì)象的拼接龙考,所以這些時(shí)候 String 對(duì)象的速度并不會(huì)比 StringBuffer 對(duì)象慢,而特別是以下的字符串對(duì)象生成中矾睦, String 效率是遠(yuǎn)要比 StringBuffer 快的:
String S1 = "This is only a" + " simple" + " test";
StringBuffer Sb = new StringBuffer("This is only a").append(" simple").append(" test");
你會(huì)很驚訝的發(fā)現(xiàn)晦款,生成 String S1 對(duì)象的速度簡(jiǎn)直太快了,而這個(gè)時(shí)候 StringBuffer 居然速度上根本一點(diǎn)都不占優(yōu)勢(shì)枚冗。其實(shí)這是 JVM 的一個(gè)把戲缓溅,在 JVM 眼里,這個(gè)
String S1 = “This is only a” + “ simple” + “test”; 其實(shí)就是:
String S1 = “This is only a simple test”;

所以當(dāng)然不需要太多的時(shí)間了赁温。但大家這里要注意的是坛怪,如果你的字符串是來(lái)自另外的 String 對(duì)象的話,速度就沒(méi)那么快了股囊,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
這時(shí)候 JVM 會(huì)規(guī)規(guī)矩矩的按照原來(lái)的方式去做

具體可以參考:https://www.cnblogs.com/syp172654682/p/8082625.html

另外袜匿,對(duì)于基本數(shù)據(jù)的包裝類型(Byte, Short, Character,Integer稚疹,F(xiàn)loat, Double居灯,Long, Boolean)除了Float和Double之外,其他的六種都是實(shí)現(xiàn)了常量池的内狗,因此對(duì)于這些數(shù)據(jù)類型而言怪嫌,一般我們也可以直接通過(guò)==來(lái)判斷是否相等。

equals:

equals在eclipse自動(dòng)生成的一種方法:


image.png

可以看出柳沙,eclipse還是很智能的岩灭,它首先是判斷兩個(gè)對(duì)象的地址是否相等,若不相等再進(jìn)行下面的成員變量判斷偎行。

但這個(gè)方法體是完全可以由我們自己實(shí)現(xiàn)的川背,即便是我們直接 return true 都是可以的贰拿,只要能滿足我們的業(yè)務(wù)需求,怎樣寫都是無(wú)所謂的熄云,因此膨更,equals比較的并不一定是對(duì)象的內(nèi)容,它還可以由其他的信息來(lái)指導(dǎo)比較缴允。

參考:https://blog.csdn.net/lcsy000/article/details/82782864
http://www.reibang.com/p/b1b75fdd5dec

文章有不當(dāng)之處請(qǐng)?zhí)岢霎愖h荚守。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市练般,隨后出現(xiàn)的幾起案子矗漾,更是在濱河造成了極大的恐慌,老刑警劉巖薄料,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敞贡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡摄职,警方通過(guò)查閱死者的電腦和手機(jī)誊役,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谷市,“玉大人蛔垢,你說(shuō)我怎么就攤上這事∑扔疲” “怎么了鹏漆?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)创泄。 經(jīng)常有香客問(wèn)我艺玲,道長(zhǎng),這世上最難降的妖魔是什么验烧? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任板驳,我火速辦了婚禮,結(jié)果婚禮上碍拆,老公的妹妹穿的比我還像新娘若治。我一直安慰自己,他們只是感情好感混,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布端幼。 她就那樣靜靜地躺著,像睡著了一般弧满。 火紅的嫁衣襯著肌膚如雪婆跑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天庭呜,我揣著相機(jī)與錄音滑进,去河邊找鬼犀忱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扶关,可吹牛的內(nèi)容都是我干的阴汇。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼节槐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搀庶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起铜异,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤哥倔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后揍庄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咆蒿,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年蚂子,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜡秽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缆镣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出试浙,到底是詐尸還是另有隱情董瞻,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布田巴,位于F島的核電站钠糊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏壹哺。R本人自食惡果不足惜抄伍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望管宵。 院中可真熱鬧截珍,春花似錦、人聲如沸箩朴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)炸庞。三九已至钱床,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間埠居,已是汗流浹背查牌。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工事期, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纸颜。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓兽泣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親懂衩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撞叨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361