有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java字符串不可变

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

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

结果是

ABC
abc

实际上,输出应该是

ABC
ABC

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


共 (2) 个答案

  1. # 1 楼答案

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

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

    将其与可变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
        }
    }
    
  2. # 2 楼答案

    实际上

    str.toUpperCase()
    

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

    如果你尝试:

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