Java 如果我可以更改字符串的值,字符串如何是不可变的?我知道我只是在更改参考,但为什么第一个场景不起作用?

Java 如果我可以更改字符串的值,字符串如何是不可变的?我知道我只是在更改参考,但为什么第一个场景不起作用?,java,Java,考虑这两种情况- 情景1: class S{ String s="hello"; s="world"; System.out.println(s); } public class StringImmutable{ public static void main(String args[]){ } Result-它在pkg.StringImmutable.main(StringImmutable.java:12)处抛出未编译的代码错误 但当我这么做的时候- c

考虑这两种情况-

情景1:

class S{
   String s="hello";
   s="world";
   System.out.println(s);
}
public class StringImmutable{
    public static void main(String args[]){

    }
Result-它在pkg.StringImmutable.main(StringImmutable.java:12)处抛出未编译的代码错误

但当我这么做的时候-

class S{
    String s="hello";

    void change(){
        s="world";
        System.out.println(s);
    }
}
public class StringImmutable{
     public static void main(String args[]){
         S s=new S();
         s.change();
     }
}
结果-世界..它工作得很好


字符串如何不可变?请在此处输入代码

您正在创建新字符串-不涉及任何变异。每次你想编辑一个字符串时(即
s1=s1+s2
s1+=s2
s1=s1)。子字符串(
…)都是创建一个新字符串,而不是突变


字符串在设计上是不可变的。

您需要区分变量和对象。如果字符串是不可变的,则
s1=“hello”;s2=s1;s2.change();
也会更改s1。您所做的是将s更改为指向不同的字符串当您执行
s=“world”
时,
s
开始指向新的字符串对象(“世界”).
“hello”
仍保留在内存中,稍后将进行GCD。@HussainAkhtarWahid'Ghouri':-我同意新用户可以像其他任何人一样进行谷歌搜索。“字符串不可变意味着什么”会产生足够多的结果。(不总是如此。赋值('=')不会创建新字符串。可能是RHS上的内容创建了新字符串。)起首部分…编辑了我的答案。