我在想java中的字符串。字符串是不可变的。但是当代码可变时
String str = new String("abc");
System.out.println(str.toUpperCase());
System.out.println(str);
外出
ABC
abc
实际上输出应该是
ABC
ABC
因为String是不可变的。请解释。谢谢!
答案 0 :(得分:5)
不,输出正是,因为字符串是不可变的。调用toUpperCase()
并不会更改现有字符串的内容,它会创建一个新字符串并返回对该字符串的引用... 有来执行此操作,因为字符串是不可变的。
这不仅仅是toUpperCase()
的情况 - String
上的所有方法听起来都可能会修改字符串(例如trim()
)实际上会返回一个新方法。
将其与 mutable 类StringBuilder
进行比较,其中对象被修改,并返回对this
的引用:
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
}
}
答案 1 :(得分:2)
实际上,
str.toUpperCase()
返回一个新的String
对象。因此,您将获得大写字符串作为输出。但是,如果您尝试将str
打印到控制台,您会看到它的值永远不会改变。
如果您尝试:
str = str.toUpperCase();
System.out.println(str);
// System.out: ABC