合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
## [字符串的不可变](https://lingcoder.gitee.io/onjava8/#/book/18-Strings?id=%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%9a%84%e4%b8%8d%e5%8f%af%e5%8f%98) `String`对象是不可变的。查看 JDK 文档你就会发现,`String`类中每一个看起来会修改`String`值的方法,实际上都是创建了一个全新的`String`对象,以包含修改后的字符串内容。而最初的`String`对象则丝毫未动。 看看下面的代码: ~~~ // strings/Immutable.java public class Immutable { public static String upcase(String s) { return s.toUpperCase(); } public static void main(String[] args) { String q = "howdy"; System.out.println(q); // howdy String qq = upcase(q); System.out.println(qq); // HOWDY System.out.println(q); // howdy } } /* Output: howdy HOWDY howdy */ ~~~ 当把`q`传递给`upcase()`方法时,实际传递的是引用的一个拷贝。其实,每当把 String 对象作为方法的参数时,都会复制一份引用,而该引用所指向的对象其实一直待在单一的物理位置上,从未动过。 回到`upcase()`的定义,传入其中的引用有了名字`s`,只有`upcase()`运行的时候,局部引用`s`才存在。一旦`upcase()`运行结束,`s`就消失了。当然了,`upcase()`的返回值,其实是最终结果的引用。这足以说明,`upcase()`返回的引用已经指向了一个新的对象,而`q`仍然在原来的位置。 `String`的这种行为正是我们想要的。例如: ~~~ String s = "asdf"; String x = Immutable.upcase(s); ~~~ 难道你真的希望`upcase()`方法改变其参数吗?对于一个方法而言,参数是为该方法提供信息的,而不是想让该方法改变自己的。在阅读这段代码时,读者自然会有这样的感觉。这一点很重要,正是有了这种保障,才使得代码易于编写和阅读。