我们可以看到两个的值是不一样的,所以此处说明String是典型的不可变类,上述代码之后代码中的内存分配情况是

  或许你看了之后会说,没关系啊,这个java会自动进行垃圾回收,到时候回收行了,到这里,我得补充一下前面没有说到的问题了:

  java为了节省内存,提高资源的复用,才引入了字符串缓存池的概念,而且,在缓存池中的字符串是不会被垃圾回收机制回收的,基本都是常驻内存,所以过多使用String类,可能会出现内存溢出。

  所以前面的代码中,对String对象进行操作后,其返回的是一个新的对象,之前那个对象是没有改变的,改变的是name这个引用所指的对象,这时候的对象已经是新的对象,然而之前那个对象被废弃了,但是他存在缓存池,因此不会被垃圾回收机制回收,所以这里会容易出现内存泄漏,所以如果要操作字符串,尽量不用String而改为使用StringBuffer或者StringBuilder。

  2)StringBuilder和StringBuffer:可变的字符串

  之所以说他们会改变的原因是:StringBuilder和StringBuffer在进行字符串操作的时候不会去创建一个新出现的对象,引用的都是同一个对象,减少了String带来的弊端。

public class Test{
   
     public static void main(String[] args) {
         StringBuilder sb = new StringBuilder("小学徒");
         System.out.println(System.identityHashCode(sb));
         sb.append("的成长历程");
         System.out.println(System.identityHashCode(sb));
     }
 }

  运行结果:

  那么StringBuilder和StringBuffer这两个类有什么区别呢?

  他们之间的区别在于StringBuffer是线程安全的,也是说StringBuffer类里绝大部分方法都增加了synchronized修饰符,这样降低了该方法的执行效率,所以在没有多线程的环境下,推荐使用StringBuilder。

  StringBuffer的源代码:

  StringBuilder的源代码:

  本文转载自:http://www.cnblogs.com/xiaoxuetu/