陷阱不理解 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
方法。如果你记得那个,那么你可以避免一大堆初学者的错误。