[問題] 關於 Java 的 call by value/reference

作者: iceman5566 (iceman5566)   2020-11-01 23:42:09
想請問一下
String s1 = "I learn";
s1 += " Java";
String s2 = "I";
s2 += " learn Java";
System.out.println(s1 == s2); //false
這個是 false 我可以理解,兩個的記憶體位置不同,因此不會是 true,
但我想問的是
String s1 = "I";
String s2 = "I";
System.out.println(s1 == s2);
既然如剛剛所說 Java 在定義變數時,記憶體位置不相同,應該要是 false,
那為何這邊是 true,在沒有二度賦值時又變成了 call by value?
還是說第一個例子的原理 不算是 call by reference?
剛開始學 Java,抱歉問題有點新手
作者: LPH66 (-6.2598534e+18f)   2020-11-02 05:44:00
常數字串會統一存在你的 class 裡, 取用時會直接拉出來用這又被叫做 string pool一樓不太精確, 應該要說是字串實字 (string literal)也就是用 "" 夾起來的字串
作者: x94fujo6   2020-11-02 05:48:00
只有object是用reference
作者: ssccg (23)   2020-11-02 15:00:00
你這兩段都沒有call,哪來的call by value/reference??你應該搞錯名詞了,這是primitive/reference type還有 ==operator定義的問題基本上是一樓說的,不過不是存在class裡,是JVM load class的時候會判斷如果string literal已經在constant pool(記憶體中)中,就會重用pool中的,不會再建新的String會這樣做是因為String是immutable,共用object沒有風險又省
作者: LPH66 (-6.2598534e+18f)   2020-11-03 04:34:00
嗯, 嚴格來說並不是物件本身存在 class 中, 而是該字串內容實際在執行時 JVM 還是會看還有沒有其他字串也有共用的
作者: protoss (天生散人)   2020-11-11 01:40:00
應該是"I"是個字串常數會放在一個string pool...所以就只有這麼一個物件...所以你的比較才會是true...而上面那個部分...你就可以把它認為在string pool有右手邊四個字串常數...s1和s1在做append時其實是另外產生copy去做append...

Links booklink

Contact Us: admin [ a t ] ucptt.com