陷阱不理解 String 是一个不可变的类

新的 Java 程序员经常忘记或者无法完全理解 Java String 类是不可变的。这会导致类似以下示例中的问题:

public class Shout {
    public static void main(String[] args) {
        for (String s : args) {
            s.toUpperCase();
            System.out.print(s);
            System.out.print(" ");
        }
        System.out.println();
    }
}

上面的代码应该以大写形式打印命令行参数。不幸的是,它不起作用,参数的情况没有改变。问题是这句话:

s.toUpperCase();

你可能会认为调用 toUpperCase() 会将 s 更改为大写字符串。它没有。它不能! String 对象是不可变的。它们无法改变。

实际上,toUpperCase() 方法返回一个 String 对象,它是你调用它的 String 的大写版本。这可能是一个新的 String 对象,但如果 s 已全部为大写,则结果可能是现有的字符串。

所以为了有效地使用这个方法,你需要使用方法调用返回的对象; 例如:

s = s.toUpperCase();

实际上,字符串永不改变规则适用于所有 String 方法。如果你记得那个,那么你可以避免一大堆初学者的错误。