Java字符串不可变

Java字符串不可变,java,string,Java,String,我在考虑java中的字符串。字符串是不可变的。但是当代码是可变的 String str = new String("abc"); System.out.println(str.toUpperCase()); System.out.println(str); 结果是 ABC abc 实际上,输出应该是 ABC ABC 因为字符串是不可变的。请解释一下。谢谢 实际上 str.toUpperCase() 返回一个新的字符串对象。因此,您将得到一个大写的字符串作为输出。但是如果您尝试将str打印

我在考虑java中的字符串。字符串是不可变的。但是当代码是可变的

String str = new String("abc");
System.out.println(str.toUpperCase());
System.out.println(str);
结果是

ABC
abc
实际上,输出应该是

ABC
ABC
因为字符串是不可变的。请解释一下。谢谢

实际上

str.toUpperCase()
返回一个新的
字符串
对象。因此,您将得到一个大写的字符串作为输出。但是如果您尝试将
str
打印到控制台,您将看到它的值从未更改

如果您尝试:

str = str.toUpperCase();
System.out.println(str);
// System.out: ABC

不,输出就是输出,因为字符串是不可变的。调用
toUpperCase()
不会更改现有字符串的内容,它会创建一个新字符串并返回对该字符串的引用。。。它必须这样做,因为字符串是不可变的

这不仅仅是
toUpperCase()
的情况-所有
String
上听起来可能会修改字符串的方法(例如
trim()
)实际上会返回一个新的

将其与修改对象的可变类
StringBuilder
进行比较,并返回对该
的引用:

public class Test {
    public static void main(String[] args) throws Exception {
        StringBuilder builder = new StringBuilder("abc");
        System.out.println(builder); // abc
        System.out.println(builder.append("def")); // abcdef
        System.out.println(builder); // abcdef
    }
}

当你调用java字符串方法时,你实际上是在做一个新的字符串。@Jar Var我认为你在OOP中与术语mutable和immutable混淆了,请参考