Java 基础字符串之StringBuilder和StringBuffer区别

百度百科的解释关于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),速度快,线程不安全.

 */


示例2:

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一样创建一些对象进行操作,所以速度就快了.





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我先来一碗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值