对String而言:
String是只读字符串,所引用的字符串不能被改变,一经定义,无法再增删改。
String 定义的字符串保存在常量池里面,进行+操作时不能直接在原有基础上拼接。
每次+操作 : 隐式在堆上new了一个跟原字符串相同的StringBuilder对象,再调用append方法 拼接+后面的字符。
例如:
String str1="ss"; StringBuilder str2=new StringBuilder(ss);
str1=str1+"oo"; 等于 str2.append(oo);
(Java6和6之前,常量池是存放在方法区中的。
Java7,将常量池是存放到了堆中,常量池就相当于是在永久代中,所以永久代存放在堆中。
Java8之后,取消了整个永久代区域,取而代之的是元空间。没有再对常量池进行调整。)
区别
String是只读字符串,所引用的字符串不能被改变,Stringbuffer和Stringbuilder定义的可以通过各种方法来达到简单的增删改;
String和Stringbuilder在单线程环境下使用;
StringBuffer在多线程环境下使用,可以保证线程同步;
Stringbuilder 和StringBuffer 实现方法类似,均表示可变字符序列,不过StringBuffer 用synchronized关键字修饰(保证线程同步)
运行速度
当需要对某一字符串大量重复+操作时:
Stringbuilder 最快,不需要考虑线程同步;
StringBuffer次之;
String最慢,因为每次都要重新开辟内存,产生很多匿名对象,影响系统性能。