作者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