Java字符串不可变

时间:2015-12-11 10:01:02

标签: java string

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

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

外出

ABC
abc

实际上输出应该是

ABC
ABC

因为String是不可变的。请解释。谢谢!

2 个答案:

答案 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