这个例子适用于java中的字符串不可变吗?

问题描述 投票:-3回答:4
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/

这个网页与我的例子相同。我真的错吗?

如果我是对的,请让我投票让更多的人知道字符串不可变的真相。

java string immutability
4个回答
2
投票

这不是不变性的示例,而是对象引用按值传递,而不是通过引用传递。因此,赋值给参数不会改变传递给它的变量的值。

虽然tell()明确地将"Hi"分配给它的论据str2,但它并没有改变str1main()的价值。


2
投票

字符串是不可变的意味着你不能改变字符串;它没有说明用新字符串替换String变量的内容。

您的输出与字符串的可变性(或不与)无关,因为您从不尝试更改字符串。你确实试图从函数中改变一个参数,但是因为Java按值传递所有东西,而str2实际上是"Hi"中的tell,这个赋值对str1没有影响(如你所见)。


1
投票

Java按值而不是通过引用传递所有内容。实际上,传递了参考的副本。因为字符串是不可变的,所以您的赋值会创建一个新的String对象,该引用的副本现在指向该对象。原始参考仍然指向“你好”。检查这个article以更好地了解为什么以及哪些是好处


1
投票

字符串不可变的示例是什么?

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

© www.soinside.com 2019 - 2024. All rights reserved.