Java字符串不可变
我在考虑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打印
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混淆了,请参考