我在不可变字符串上写了下面的代码。

public class ImmutableStrings {

    public static void main(String[] args) {
        testmethod();
    }

    private static void testmethod() {
        String a = "a";
        System.out.println("a 1-->" + a);
        a = "ty";
        System.out.println("a 2-->" + a);
    }
}

输出:

a 1-->a  
a 2-->ty

这里变量a的值被改变了(尽管许多人说不可变对象的内容不能被改变)。但是说字符串是不可变的到底是什么意思呢?你能给我解释一下这个话题吗?

来源:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html


当前回答

希望下面的代码能澄清你的疑问:

public static void testString() {
    String str = "Hello";
    System.out.println("Before String Concat: "+str);
    str.concat("World");
    System.out.println("After String Concat: "+str);
    StringBuffer sb = new StringBuffer("Hello");
    System.out.println("Before StringBuffer Append: "+sb);
    sb.append("World");
    System.out.println("After StringBuffer Append: "+sb);
}

字符串Concat:你好 字符串后Concat:你好 在StringBuffer追加之前:Hello StringBuffer后追加:HelloWorld

其他回答

String S1="abc";
S1.concat("xyz");
System.out.println("S1 is", + S1);
String S2=S1.concat("def");
System.out.println("S2 is", + S2);

这表明一旦创建了一个字符串对象,它就不能被更改。每次你需要创建new并放入另一个String。年代

你实际上得到了一个新字符串的引用,字符串本身没有被改变,因为它是不可变的。这是相关的。

See

维基百科上的不可变对象

字符串是不可变的,这意味着,字符串对象的内容不能被改变,一旦它被创建。如果你想修改内容,那么你可以去StringBuffer/StringBuilder而不是String。StringBuffer和StringBuilder是可变类。

不可变意味着你不能不改变同一个引用的值。每次你需要创建新的引用就意味着新的内存位置。 例:

String str="abc";
str="bcd";

在上面的代码中,内存中有2个块用于存储值。第一个表示“abc”,第二个表示“bcd”。第二个值不替换第一个值。

这叫做不可变。

只有参照物在改变。首先a引用的是字符串"a",后来你把它改成了"ty"。字符串“a”保持不变。