background image

  s = new String("Initial Value");

  后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,
因为 String 对象不可改变,所以对于内容相同的字符串,只要一个 String 对象来表示就
可以了。也就说,多次调用上面的构造器创建多个对象,他们的 String 类型属性 s 都指
向同一个对象。
  上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java 认为它们
代表同一个 String 对象。而用关键字 new 调用构造器,总是会创建一个新的对象,无论
内容是否相同。
  至于为什么要把 String 类设计成不可变类,是它的用途决定的。其实不只 String,
很多 Java 标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设
计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,
比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,
比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以 Java 标准类
库还提供了一个可变版本,即 StringBuffer。