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

看板java作者 (壞魯)時間4年前 (2020/11/02 23:39), 4年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《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
文章代碼(AID): #1Ve2WoQ6 (java)
文章代碼(AID): #1Ve2WoQ6 (java)