查看完整版本: String物件問題
頁: [1]

1006910211 發表於 2016-7-14 10:25 AM

String物件問題


小弟我一個字串問題的疑問,String不同於一般型別,他是一個物件,如以下範例str1 = "apple"即是建立一個新的物件,那我再宣告str2 = "apple"即是在建立一個物件
那麼問題來了 ......字串比對內容是用equals沒錯,但以下範例if(str1 == str2)卻是可以成立的印出ok,我有點不解的是==是用來比對物件的儲存位址是否相同,那麼str1跟str2都隸屬於不同物件位址,為何if(str1 == str2)卻是可以成立
麻煩各位大大協助解開我心裡疑惑,非常感謝


        String str1 = "apple";
        String str2 = "apple";

        if(str1 == str2){
            System.out.println("ok");
        }
        if(str1.equals(str2)){
            System.out.println("ok2");
        }

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

theloserbm 發表於 2016-7-14 03:21 PM

https://en.wikipedia.org/wiki/String_interning

一些程式語言會把創造同樣的String返回同樣的物件, Java是其中一個, 所以在你的例子其實就是同一個物件.

要測試==不相同的例子, 可以把其中一個或兩個都用其他方式去構成, 如new String()或char[]等等

1006910211 發表於 2016-7-14 05:27 PM

theloserbm 發表於 2016-7-14 03:21 PM static/image/common/back.gif
https://en.wikipedia.org/wiki/String_interning

一些程式語言會把創造同樣的String返回同樣的物件, Java ...

謝謝您 我了解了
有測試其他的方式建構字串
非常感謝

22616846 發表於 2016-7-14 09:52 PM

java 使用 = 建立字串時,JVM會自行在記憶體中使用一個字串池(String pool)來維護,所以str2 的字串發現在str1已經建立過了 ,他就不會在新建立一個字串,所以如果你用 new String來產生字串,你就會發現用 == 結果就會是false

1006910211 發表於 2016-7-15 10:41 AM

22616846 發表於 2016-7-14 09:52 PM static/image/common/back.gif
java 使用 = 建立字串時,JVM會自行在記憶體中使用一個字串池(String pool)來維護,所以str2 的字串發現 ...

了解,JAVA還有很多東西我還須學習
感謝您的回覆,非常感謝<br><br><br><br><br><div></div>

Lak4CYUT 發表於 2016-7-16 05:37 PM

如果是語言本身沒有定義的狀況,有時它的結果取決於 compiler。(Java 這類的問題可能比較少,C/C++很多)
這種 based on compiler 的特性,不建議去背它,也許你換一套 VM or Compiler 就會有不同的結果了。
頁: [1]