Java字符串那些事兒

咱們再來看一段代碼:java

運行一下:post

沒錯,一個true,一個是false,(答錯的小朋友去面壁去),你們可能在想編譯器確定又調皮了,編譯的時候是否是又偷偷加了些什麼,火燒眉毛的打開class文件看一下:3d

除了刪掉了空行之外和個人java源文件一致呀,這回可冤枉編譯器了,那爲何會致使不一樣的結果呢?咱們都知道,Java代碼是運行在JVM裏的,那是否是JVM在執行這段代碼時給咱們作了什麼?
在JVM中,當代碼執行到String s1 = "100" 時,會先看常量池裏有沒有字符串恰好是「100」這個對象,若是沒有,在常量池裏建立初始化該對象,並把引用指向它,以下圖,綠色部分爲常量池,存在於堆內存中cdn

當執行到String s2 = "100" 時,發現常量池已經有了100這個值,因而再也不在常量池中建立這個對象,而是把引用直接指向了該對象,以下圖:對象

這時候咱們打印System.out.println(s1 == s2)時,因爲==是判斷兩個對象是否指向同一個引用,因此這兒打印出來的就應該是true。
blog

繼續執行到Strings3 = new String("100") 這時候咱們加了一個new關鍵字,這個關鍵字呢就是告訴JVM,你直接在堆內存裏給我開闢一塊新的內存,以下圖所示:內存

繼續執行String s4 = new String("100")字符串

這時候再打印System.out.println(s3 == s4) 那必定即是false了,由於s3和s4不是指向對一個引用(對象)。get

注:圖中只是畫出了main方法棧和相關對象在內存中的大體模擬,實際中JVM中內存管理比較複雜,你們有條件的話能夠去找《Java虛擬機規範》這本書去深刻研究。

結論:咱們在比較兩個String對象內容時,不管是怎麼聲明的,都必定要使用equals去比較,不能用==,在Java中沒有重載操做符這一說,特別是從其它語言轉到Java的童鞋們要注意。equals我會在後續專欄裏已經作了詳細解說。編譯器


上一篇:讓人疑惑的Java代碼 - Java那些事兒

下一篇:說說Java裏的equals(上) - Java那些事兒


若是喜歡本系列文章,請爲我點贊或順手分享,您的支持是我繼續下去的動力,您也能夠在評論區留言想了解的內容,有機會本專欄會作講解,最後別忘了關注一下我。

轉載無限歡迎,但請註明「做者」和「原文地址」。轉載請在文中保留此段,感謝您對做者版權的尊重。如需商業轉載或刊登,請聯繫做者得到受權。

相關文章
相關標籤/搜索