白话说String,StringBuffer,StringBuilder


啥是String,StringBuffer,StringBuilder??

  • String :字符串常量字符串长度不可变!!

注:所有对String的操作最终返回的都是一个新的String,原字符串并没有变。

  • StringBuffer :字符串变量(Synchronized,即线程安全),如果要频繁对字符串内容进行修改,出于效率考虑最好使用StringBuffer,如果想转成String类型,可以调用StringBuffer的toString(); StringBuffer上的主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据。append方法始终将这些字符添加到缓冲区的末端;而insert方法则在指定的点添加字符。

  • StringBuilder 字符串变量(非线程安全) ,这是在JDK5.0新增加的!该对象是一 个线程不安全的字符串容器,在单线程操作的情况下此对象可以用于取代StringBuffer!!

  • (String和StringBuffer )两者者之间的区别:
    这两者之间的区别主要区别在性能上,String每次对存放进String当中的字符串进行更改的时候都会生成一个新的
    String对象然后指针指向该对象(虽然Java不承认自己有指针这回事),而一旦当产生的没有引用指向对象过多的时候,这个时候GC就会出动,对其进行清理,这个时候性能就会有所降低!而使用StringBuffer的时候,每次都会对该对象本身进行操作,而不是去创建一个新的对象,所以在多数情况下还是推荐使用该对象(即使用StringBuffer)。

StringBuilder 和 StringBuffer 适用的场景是什么?

stringbuffer固然是线程安全的,因此stringbuffer是比stringbuilder更慢,在多线程的情况下,理论上是应该使用线程安全的stringbuffer的。

实际上基本没有什么地方显示你需要一个线程安全的string拼接器 。

stringbuffer基本没有适用场景,你应该在所有的情况下选择使用stringbuiler,除非你真的遇到了一个需要线程安全的场景 。

stringbuffer的线程安全,仅仅是保证jvm不抛出异常顺利的往下执行而已,它可不保证逻辑正确和调用顺序正确。大多数时候,我们需要的不仅仅是线程安全,而是锁。

可能有人会问,既然这样为什么还会有StringBuffer??

因为最早是没有stringbuilder的,sun的人不知处于何种考虑,决定让stringbuffer是线程安全的,

于是,在jdk1.5的时候,终于决定提供一个非线程安全的stringbuffer实现,并命名为stringbuilder。

顺便,javac好像大概也是从这个版本开始,把所有用加号连接的string运算都隐式的改写成stringbuilder,

也就是说,从jdk1.5开始,用加号拼接字符串已经几乎没有什么性能损失了。