String, StringBuffer, StringBuilder三者区别

作为一个java初学者,看了很多博主对着三个类之间区别的介绍,自己总结了一下:

一.共同点:

1.三者的共同点:

String, StringBuffer, StringBuilder类都可以储存和操作字符串,三者都实现了CharSequence接口,即三者都是字符序列,底层都是用char[]实现的。

2.StringBuffer和StringBuilder类的共同点:

它们都继承于AbstractStringBuilder,并且具有相同的API;

均使用了内部缓冲区,当内部缓冲区溢出后均会自动增大

二.不同点:

1.String类

java.lang.String类是final类型的,因此不可以继承和修改这个类。

也就是说String类的对象一旦赋值就不可更改,这样设计的目的是简化存储(也就是String对象的共享)。

如果对其赋予新值将会开辟新的内存地址进行存储。举个例子:

String s="Hello Java";
s=new String("Hello Java");
s=s.concat("!");

此时在内存中有两个空间是没有指向的,也不会被回收,因为它们都不是Null,只有等到代码结束才会被回收。
在小程序中这样的开销可以忽略,但大型工程中,大量的此类开销会对代码的运行速度带来很大的影响。

2.StringBuffer和StringBuilder类

这两个类是在原有对象存储的内存地址上进行操作,使用append和insert等方法改变字符串的值,换句话说,在生成对象后可改变其内部的char[],比如扩容,插入,删除等,因此对内存的消耗要比String少很多。

3.三者间的区别

对String操作后都是产生一个新的字符串对象,而StringBuffer和StringBuilder类操作的始终是原对象。

例子:把1到100之间所有数字按序连接起来,组成一个串

StringBuffer sbf = new StringBuffer(); 
for(int i = 0; i < 100; i++)
{
       sbf.append(i);
}
上面的代码只创建了一个StringBuffer对象,始终指向一个串,改变的只是串的内容,所以效率很高。

而下面的代码效率很低,因为创建了101个对象,在执行+的时候实际上是将对象str指向了另外一个字符串,这样在执行多次+之后就浪费了很多资源。
String str = new String(); 
for(int i = 0; i < 100; i++)
{
       str = str + i;
}

所以,当需要频繁地执行修改字符串的操作时,可以先建立StringBuffer类对象进行操作,然后将结果转化成String类对象返回StringBuffer.toSting(),效率会高很多。

但是,在某些特别情况下,String对象的字符串拼接其实被JVM解释成了StringBuffer对象的拼接,这些时候String对象的速度并不会比StringBuffer对象慢,而特别是以下字符串对象生成中,String效率远要比StringBuffer快:
 String S1 = “This is only a” + “ simple” + “ test”;
 StringBuffer Sb = new StringBuilder(“This is only a”).append(“simple”).append(“ test”);

通过对比你会发现,生成String S1对象的速度简直太快了,而StringBuffer居然一点都不占优势。其实这是JVM 的一个把戏,在JVM眼里,String S1 = “This is only a” + “ simple” + “test”;

其实就是String S1 = “This is only a simple test”;所以当然不需要太多的时间。

但要注意的是,如果你的字符串是来自其它的String对象的话,速度就没那么快了,比如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候JVM会规规矩矩的按照原来的方式去做。

4.StringBuffer和StringBuilder类的区别

StringBuffer是线程同步的,可用于并发环境,安全,效率低(少量数据看不出差别)。

StringBuilder是非线程同步的,适合在单线程环境使用,因为不用检查对象锁,所以速度快、效率高。

StringBuffer的大部分方法上都有synchronized关键字,而StringBuilder上没有。

三.总结:

1.对字符串的操作次数很少:String

2.单线程环境下对字符串有大量操作:StringBuilder

3.多线程环境下对字符串有大量操作:StringBuffer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值