public static void main(String[] args){
String str1 = "Hello";
System.out.println(str1);
tell(str1);
System.out.println(str1);
}
public static void tell(String str2){
str2 = "Hi";
}
output: Hello
Hello
这个例子适合字符串不可变吗?我认为引用str2可能会改变str1字符串值,导致它们引用同一个地址。如果String类是可变的,则输出可能是Hello Hi,并且由于不可变特性,最终结果是Hello Hello。
这个例子的理由是正确的吗?
http://www.explain-java.com/is-string-mutable-in-java-why-wrapper-classes-immutable-in-java/
这个网页与我的例子相同。我真的错吗?
如果我是对的,请让我投票让更多的人知道字符串不可变的真相。
这不是不变性的示例,而是对象引用按值传递,而不是通过引用传递。因此,赋值给参数不会改变传递给它的变量的值。
虽然tell()
明确地将"Hi"
分配给它的论据str2
,但它并没有改变str1
中main()
的价值。
字符串是不可变的意味着你不能改变字符串;它没有说明用新字符串替换String变量的内容。
您的输出与字符串的可变性(或不与)无关,因为您从不尝试更改字符串。你确实试图从函数中改变一个参数,但是因为Java按值传递所有东西,而str2
实际上是"Hi"
中的tell
,这个赋值对str1
没有影响(如你所见)。
Java按值而不是通过引用传递所有内容。实际上,传递了参考的副本。因为字符串是不可变的,所以您的赋值会创建一个新的String对象,该引用的副本现在指向该对象。原始参考仍然指向“你好”。检查这个article以更好地了解为什么以及哪些是好处
字符串不可变的示例是什么?
Case1:在这种情况下,字符串“java2s”是不可变的。
class Main {
public static void main(String args[]) {
String s = "java2s";
s.replace('a', 'Z').trim().concat("Aa");
s.substring(0, 2);
System.out.println(s);
}
}
输出:java2s
情况2:在这种情况下,字符串“java2s”是不可变的,但新字符串分配给's'引用变量。
public class Main {
public static void main(String args[]) {
String s = "java2s".replace('a', 'Z').trim().concat("Aa");
s.substring(0, 2);
System.out.println(s);
}
}
输出:jZvZ2sAa