在Java字符串那些事兒一文發表後,朋友給我留言說:比較字符串用equals不就完了唄,幹嗎要用"==",吃飽了撐的,能不能來點實際的。其實在文章裏我是想代表,Java字符串兩種聲明方式在堆內存中不一樣的體現,咱們在寫代碼過程當中,爲了不重複的建立對象,儘可能使用String s1 ="123" 而不是String s1 = new String("123"),由於JVM對前者給作了優化。面試
那麼,咱們今天來講說equels,話很少說,上代碼:數組
執行一下,結果以下:post
面試題中老問"=="與和equals有什麼區別,甚至連百度搜索equals也會自動關聯出equals和"=="的區別這一類的問題來。優化
筆者一直認爲,這二者之間沒有必然的聯繫,在引用類型中,"=="是比較兩個引用是否指向堆內存裏的同一個地址(同一個對象),而equals是一個普通的方法,該方法返回的結果依賴於自身的實現。咱們先看一下Person這個類,並無equals方法呀,那爲何不報錯呢?在Java中,若是一個類沒有繼承其它類,那麼它默認繼承Object這個類,打開Object這個類看一下,發現以下代碼,Person這個類的equals方法就繼承自這裏3d
很簡單,就一句代碼,判斷兩個引用是否指向同一個對象,兩個Person對象在堆內存中的表現以下圖所示:cdn
因此代碼person1.equals(person2)等同於person1 == person2,固然打印出來的結果是false。咱們再來看看Integer這個類, equals的實現以下:對象
當代碼執行到System.out.println(itr.equals(lon))時,會判斷傳入的lon這個對象是不是Integer類型,這裏的lon是Long類型,因此打印出來的結果固然是false了。blog
最後是咱們String的實現繼承
當代碼執行到:System.out.println(s3.equals(s4)),因爲字符串底層char數組裏存的都是{'1','0','0'}固然打印出來是true了。內存
注:本專欄全部示例代碼已上傳至公衆號:saysayJava
若是喜歡本系列文章,請爲我點贊或順手分享,您的支持是我繼續下去的動力,您也能夠在評論區留言想了解的內容,有機會本專欄會作講解,最後別忘了關注一下我。
轉載無限歡迎,但請註明「做者」和「原文地址」。轉載請在文中保留此段,感謝您對做者版權的尊重。如需商業轉載或刊登,請聯繫做者得到受權。
上一篇:Java字符串那些事兒
下一篇:Java中的數組