在Java字符串那些事兒一文發(fā)表后伤极,朋友給我留言說:比較字符串用equals不就完了唄,干嘛要用"=="姨伤,吃飽了撐的哨坪,能不能來點實際的。其實在文章里我是想表明乍楚,Java字符串兩種聲明方式在堆內(nèi)存中不同的體現(xiàn)当编,我們在寫代碼過程中,為了避免重復(fù)的創(chuàng)建對象徒溪,盡量使用String s1 ="123" 而不是String s1 = new String("123")忿偷,因為JVM對前者給做了優(yōu)化拧篮。
那么,我們今天來說說equels牵舱,話不多說串绩,上代碼:
執(zhí)行一下,結(jié)果如下:
面試題中老問"=="與和equals有什么區(qū)別芜壁,甚至連百度搜索equals也會自動關(guān)聯(lián)出equals和"=="的區(qū)別這一類的問題來礁凡。
筆者一直認為,這兩者之間沒有必然的聯(lián)系慧妄,在引用類型中顷牌,"=="是比較兩個引用是否指向堆內(nèi)存里的同一個地址(同一個對象),而equals是一個普通的方法塞淹,該方法返回的結(jié)果依賴于自身的實現(xiàn)窟蓝。我們先看一下Person這個類,并沒有equals方法呀饱普,那為什么不報錯呢运挫?在Java中,如果一個類沒有繼承其它類套耕,那么它默認繼承Object這個類谁帕,打開Object這個類看一下,發(fā)現(xiàn)如下代碼冯袍,Person這個類的equals方法就繼承自這里
很簡單匈挖,就一句代碼,判斷兩個引用是否指向同一個對象康愤,兩個Person對象在堆內(nèi)存中的表現(xiàn)如下圖所示:
所以代碼person1.equals(person2)等同于person1 == person2儡循,當然打印出來的結(jié)果是false。我們再來看看Integer這個類征冷, equals的實現(xiàn)如下:
當代碼執(zhí)行到System.out.println(itr.equals(lon))時择膝,會判斷傳入的lon這個對象是否是Integer類型,這里的lon是Long類型资盅,所以打印出來的結(jié)果當然是false了调榄。
最后是我們String的實現(xiàn)
當代碼執(zhí)行到:System.out.println(s3.equals(s4)),由于字符串底層char數(shù)組里存的都是{'1','0','0'}當然打印出來是true了呵扛。
如果喜歡本系列文章每庆,請為我點贊或順手分享,您的支持是我繼續(xù)下去的動力今穿,您也可以在評論區(qū)留言想了解的內(nèi)容缤灵,有機會本專欄會做講解,最后別忘了關(guān)注一下我。
轉(zhuǎn)載無限歡迎腮出,但請注明「作者」和「原文地址」帖鸦。轉(zhuǎn)載請在文中保留此段,感謝您對作者版權(quán)的尊重胚嘲。