String、StringBuffer和StringBuilder

来源:互联网 发布:军粮 知乎 编辑:程序博客网 时间:2024/05/16 07:45

StringBuffer、StringBuilder和String一样,也用来代表字符串。

String类是不可变类,任何对String的改变都 会引发新的String对象的生成;

String s = "abcd";

= s+1;

我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 查看源码得知,String类的声明是:public final,所以可以很清楚的知道,fianl的话是改变不了的,所以,如果我们用String来操作字符串的时候,一旦我们字符串的值改变,就会在内存创建多一个空间来保存新的字符串。JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。


而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。


StringBuffer sb = new StringBuffer(“abcd”);
sb.append(“efg”);
则对象sb的值将变成”abcdefg”;

使用该方法进行字符串的连接,将比String更加节约内容,经常应用于数据库SQL语句的连接。

StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象。既然可变和不可变都有了,为何还有一个StringBuilder呢?

先说一下集合的故事,HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。StringBuffer和StringBuilder类的区别也是如此,他们的原理和操作基本相同,区别在于StringBufferd支持并发操作,线性安全的,适合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。

总的来说:

1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String

2.StringBuffer:线程安全

   StringBuilder:非线程安全

对于三者使用的总结

1.如果要操作少量的数据用 = String

2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer