作者b9502056 (壞魯)
看板java
標題Re: [問題] 關於 Java 的 call by value/reference
時間Mon Nov 2 23:39:27 2020
※ 引述《iceman5566 (iceman5566)》之銘言:
: 想請問一下
: String s1 = "I learn";
: s1 += " Java";
: String s2 = "I";
: s2 += " learn Java";
: System.out.println(s1 == s2); //false
: 這個是 false 我可以理解,兩個的記憶體位置不同,因此不會是 true,
String 比對值 切記要用.equals()
System.out.println(s1.equals(s2)); // true
: 但我想問的是
: String s1 = "I";
: String s2 = "I";
: System.out.println(s1 == s2);
: 既然如剛剛所說 Java 在定義變數時,記憶體位置不相同,應該要是 false,
這裡的s1, s2的記憶體位置都指向同一個object也就是"I" 的記憶體位置
: 那為何這邊是 true,在沒有二度賦值時又變成了 call by value?
: 還是說第一個例子的原理 不算是 call by reference?
: 剛開始學 Java,抱歉問題有點新手
你的理解沒有問題,問題是出在 Java 的 String 背後的操作和你想的不太一樣
你看到的
s1 += " Java";
在編譯後會變成
s1 = new StringBuilder(s1).append(" Java").toString()
StringBuilder.toString() 底層是使用new String
new String("<a string value>") 會返回一個新的字串Ojbect(新的記憶體位置)
/// 常見的考題例如 s1 = "I learn" + " Java" 總共產生了幾了object?
例如:
String a = "A";
String a2 = new String("A");
String a3 = "A";
System.out.println(a==a2); // false
System.out.println(a.equals(a2));// true
System.out.println(a3==a); // true
System.out.println(a3==a2); // false
ref:
https://dzone.com/articles/string-concatenation-performacne-improvement-in-ja
PS: Java 的 call method 都是 call by value,Java 沒有 call by reference
如果你看到call method 有 call by reference 的效果
那只是被傳進去的 object 裡面的值被改變了
簡單來說,Primitive Data Types(和String),不會因為傳入 method 後被改變,
其他的都會,例如: int[], AtomicBoolean ,可以傳入 method 後被改變值
※ 編輯: b9502056 (118.165.75.217 臺灣), 11/03/2020 00:06:22