網上看到的一篇文章講的字符串常量。其它沒什么問題,主要是str7==str8的值為false,表示這個不理解,還望達人們能指點一下。如果能從引用(or地址?)的創建、改變的角度談談則再好不過了。先行謝過~代碼如下(代碼已經被我簡化過了,只保留有疑問部分):publicclassDemoStringCreation{publicstaticvoidmain(Stringargs[]){Strings="lo";Stringstr7="Hel"+s;Stringstr8="He"+"llo";System.out.println("str7==str8is"+(str7==str8));System.out.println("str7.equals(str8)is"+str7.equals(str8));}}/*******************************updated2014.04.1814:40********************/@brayden大大從編譯的角度給出了解釋,我相信這個解釋足夠底層、根本,無奈我看不太明白-_-!!這篇文章最下面幾段給了解釋,理解起來似乎有了些感覺。示例代碼與相應的解釋我也貼一下,/****************粘貼開始******************/Stringa="ab";Stringbb="b";Stringb="a"+bb;System.out.println((a==b));//result=false分析:JVM對于字符串引用,由于在字符串的"+"連接中,有字符串引用存在,而引用的值在程序編譯期是無法確定的,即"a"+bb無法被編譯器優化,只有在程序運行期來動態分配并將連接后的新地址賦給b。所以上面程序的結果也就為false。Stringa="ab";finalStringbb="b";Stringb="a"+bb;System.out.println((a==b));//result=true分析:和上面例子唯一不同的是bb字符串加了final修飾,對于final修飾的變量,它在編譯時被解析為常量值的一個本地拷貝存儲到自己的常量池中或嵌入到它的字節碼流中。所以此時的"a"+bb和"a"+"b"效果是一樣的。故上面程序的結果為true。Stringa="ab";finalStringbb=getBB();Stringb="a"+bb;System.out.println((a==b));//result=falseprivatestaticStringgetBB(){return"b";}分析:JVM對于字符串引用bb,它的值在編譯期無法確定,只有在程序運行期調用方法后,將方法的返回值和"a"來動態連接并分配地址為b,故上面程序的結果為false。/****************粘貼結束******************/Ok,這里我的新問題又來了,什么時候是編譯期,什么時候是才算是運行期呢?(問題是不是太基礎了?我自己都懷疑……裝載、編譯、運行這些概念是經常碰到,就是從來沒有完全弄清楚過程)如果這個問題解決了,那按照上面貼的這篇文章里的解釋,就能完全理解通了?;蛘?,能不能把@brayden大大的那個編譯解釋明白一點點?
java字符串常量問題
千萬里不及你
2019-04-09 20:25:44