作者Minilogo ()
看板java
標題[問題] 有關JAVA的reference
時間Sun Jun 9 14:18:12 2013
各位好
最近在寫code的時候犯了一個常見的錯誤,這個bug是看成程式碼的時候發現的,之前都
沒有出錯。
它的形式大概是
String str;
str = "1";
doSth();
str = "2";
doSth();
str = "3";
doSth();
str = "2";
doSth();
void doSth() {
if (str == "1") {
str = "2";
...
} else if (str == "2") {
str = "3";
...
} else if (str == "3") {
str = "1";
...
}
}
我知道比對字串內容應該要用equals,但這段code竟然能像我想的一樣進行。
我是由C/C++開始寫程式的,我在寫JAVA的時候也發現雖然JAVA表面上說沒有指標,
但根本到處都是指標的行為,reference也跟C++的reference不一樣。
但我沒有深入理解JAVA的機制,所以如果用C/C++來解釋的話,就是
把JAVA的String str改成C/C++的char* str
str = "1" 實際是把"1"的位址存進去,比對(==)的時候也是比位址一不一樣,
而相同內容的多個string literal編譯器又通常只存一個,
所以才會"剛好"像我想的那樣進行。
但 JAVA 不知道是不是可以用一樣的道理解釋,或是因為不同的原因,拜託麻煩各位
解答了,謝謝。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.165.124.79
→ tkcn:String pool 06/09 14:25
→ Minilogo:謝謝 部分相同 但更加進步 06/09 14:30
推 PsMonkey:用變數代替就會炸光光啦 06/09 15:56
→ PsMonkey:嗚嗚嗚嗚... 我錯了...... Orz 06/09 17:12
→ Minilogo:PsMonkey你是說String s1="1"; String s2="2"這樣的嗎? 06/09 18:42
推 PsMonkey:不是,我完全記錯了,不要管我... 06/09 18:49
→ PsMonkey:要 str = new String("1") 才會出事.... 06/09 18:49
→ PsMonkey:可惜 tkcn 都不酸我 XDDDD 06/09 18:49
→ tkcn:留著等有板聚時爆料呀,PsMonkey 犯錯大全 (817 pages) 06/09 19:17
→ swpoker:string要用equal 06/10 09:24