百度百科的解释关于StringBuilder
在 StringBuilder 上的主要操作是 append 和 insert 方法。
每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。
append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容为“start”的字符串生成器对象,则该方法调用 z.append("le") 将使字符串生成器包含“startle”,而 z.insert(4, "le") 将更改字符串生成器,使之包含“starlet”。 通常,如果 n引用 StringBuilder 的实例(StringBuilder n = new StringBuilder();),则 n.append(x) 和 n.insert(n.length(), x) 具有相同的效果。 每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。
将StringBuilder的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer。
StringBuilder类可以用于在无需创建一个新的字符串对象情况下修改字符串。StringBuilder不是线程安全的,而StringBuffer是线程安全的。
但StringBuilder在单线程中的性能比StringBuffer高。
StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。
每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。
事实是,StringBuilder比string快的原因是string拼接时产生了中间对象,最终是垃圾。如: string str = "a";str += "b";str += "c";那么,最终结果是"abc",但第二行产生了"ab"只是一个中间对象,是个垃圾。
用StringBuilder会避免这种中间对象的产生。那如果我这么写呢? string str ="a"+"b"+ "c";这会比StringBuilder慢吗?不会。
中间对象的产生才是影响性能的主要原因。
String=char[]+操作(复制创建新对象)char[]不可变
StringBuilder=char[]+对char[]操作(处理当前数组内容)
char[]可变 StringBuilder内的char[]数组可变,如果长度不够,利用长算法维护,自动扩容长度.
示例1:
publicclass StringBuilderDemo {
publicstaticvoid main(String[] args) {
StringBuilder Buf=new StringBuilder();
Buf.append("建国").append("的妻子").append("是").append("小红").append("据说十分漂亮").insert(0,"班长").delete(4, 6).append(".");
System.out.println("第1次打印:StringBuilder的buf对象是==="+Buf);
//将StringBuilder对象转化成String对象
String str=Buf.toString();
System.out.println("第2次打印:转换后字符串Str是==="+str);
//将String构造成StringStringBuilder
StringBuilder ttt=new StringBuilder("888");
System.out.println("第3次打印:StringBuilder对象是==="+ttt);
}
}
运行结果是:
第1次打印:StringBuilder的buf对象是===大师建国子是小红据说十分漂亮.
第2次打印:转换后字符串Str是===班长建国子是小红据说十分漂亮.
第3次打印:StringBuilder对象是===888
注:
1.append()方法,表示追加,该方法反复操作的始终是1对象
2.insert()方法,表示插入
3.delete()方法,表示删除
StringBuilder>>>>>>>
* (1)StringBuilder是变长字符序列
* (2)StringBuilder方法:append,insert...都返回当前StringBuilder对象本身的引用
* (3)如过程序需要大量的字符串转换的时候建议用StringBuilder
* (4)String s=s1+s2;
* java实际代码是如下运行:String s=new StringBuilder(s1).append(s2).toString();
* (5)String s=s1+s2+s3+s4;
* 被优化为:String s=new StringBuilder(s1).append(s2).append.(s3).append.(s4).toString();
* (6)s+="a";会产生两个新对象(StringBuilder,String);
* StringBuilder Buf=new StringBuilder();
* Buf.append("a");
* Buf.append("a");
*
* StringBuilder和StringBuffer---API几乎一样(相同点)
*
* 不同点:
* StringBuffer是java早期提供的(JDK1.0),速度稍慢,线程安全,
* StringBuilder是java5以后提供的(JDK5.0),速度快,线程不安全.
*/
publicclass StringPKStringBuilderDemo {
publicstaticvoid main(String[] args) {
System.out.println("测试String结果:"+testString(30000));//测试字符串
System.out.println("测试StringBuilder结果:"+testStringBuilder(30000));//测试StringBuilder
}
//测试String字符串性能;
privatestaticlong testString(int n){
long start=System.currentTimeMillis();
String s="";
for (int i = 0; i < n; i++) {
s=s+"A";
}
long end=System.currentTimeMillis();
return end-start;
}
//测试StringBuilder性能;
privatestaticlong testStringBuilder(int n){
long start=System.currentTimeMillis();
StringBuilder buf=new StringBuilder();
for (int i = 0; i < n; i++) {
buf=buf.append("A");
}
long end=System.currentTimeMillis();
return end-start;
}
}
运行结果:
测试String结果:482
测试StringBuilder结果:1
注:
1.s+="A";相当于S=new StringBuilder(s).append("A").toString.每当做一次字符串拼接,就会创建一个StringBuilder新对象,同时JVM在适时回收这些对象,如此会影响性能.
2.结论:处理少量字符串拼接的时候使用:String s="A"+"B";
处理大量字符串拼接的时候使用:StringBuilder.(单线程操作字符串缓冲区)
处理大量字符串拼接的时候使用:StringBuffer(多线程操作字符串缓冲区)
3.如果对字符串性能有极高的要求,则直接操作char[]数组.
4.执行速度方面的比较:StringBuilder > StringBuffer
5.StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,不像String一样创建一些对象进行操作,所以速度就快了.