解释一下,字符串是不可变的

use*_*612 1 java string immutability

我读了很多字符串对象是不可变的,只有字符串缓冲区是可变的.但是当我尝试这个程序时.我很迷惑.所以这个计划到底发生了什么.

class Stringss {
    public static void main(String[] args) {

        String s="hello";
        String ss=new String("xyz");
        System.out.println(ss);
        System.out.println(s);

        s="do";
        ss=new String("hello");
        System.out.println(s);
        System.out.println(ss);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是

xyz
hello
do
hello
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 8

在您的代码中,s不是String对象.它是 String对象的引用.您的代码使它引用了几个不同的String对象.但String对象本身不会改变.

例如,如果可以的话,字符串将不是不可变的

s.setCharacterAt(3, 'Z');
Run Code Online (Sandbox Code Playgroud)

要么

s.setValue("foo")
Run Code Online (Sandbox Code Playgroud)

但是这样做

s = "a string";
s = "another string";
Run Code Online (Sandbox Code Playgroud)

不会更改"a string"对象包含的内容.它只是指向另一个String.

作为类比,VHS是可变的.你可以替换乐队的内容.DVD是不可变的:您无法更改磁盘上正在写入的内容.但这并不妨碍DVD播放机播放几种不同的DVD.将另一张DVD放入DVD播放机内并不会改变DVD所包含的内容.