作为一个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