java String和StringBuilder、StringBuffer浅谈

java面试中经常会问到这两者之间的区别,学习记录一下。

基本概念:

  1. String
    String是对象而不是原始类型,它是个final类,不能被继承,同时它也是不可变对象,一旦创建一个String对象就不能修改它的值。我们平常对于String的修改都是重新创建一个新的对象,然后把新的值保存进去的。
  1. StringBuffer
    StringBuffer是一个可变的对象,对它进行修改的时候不会像String那样重新创建一个对象。

  2. StringBuilder
    StringBuilder和StringBuffer一样,都是一个可变的对象,对它进行修改的时候不会像String那样重新创建一个对象。那StringBuffer和StringBuilder有啥区别呢?他们最大的区别就是:StringBuilder的方法不是线程安全的(不能同步访问)。

注:
1、由于StringBuilder相较于StringBuffer有速度优势,所以多数情况下建议使用StringBuilder类。然而在应用程序要求线程安全的情况下,则必须使用StringBuffer类。

2、java中的线程安全(来自百度

就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问

什么叫线程安全:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。


使用策略:

1、如果是操作少量的数据,可以使用String,如果是在单线程下操作大量数据,则用StringBuilder,如果是在多线程下,则使用StringBuffer(线程安全)。

2、不要使用String类的“+”进行频繁的连接操作,应该使用
应该使用StringBuffer或StringBuilder类的append()操作,这在Java的优化上是一条比较重要的原则。

3、相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15%
左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在
StringBuffer
上,并且确定你的模块不会运行在多线程模式下,才可以采用StringBuilder;否则还是用StringBuffer。

参考资料:
1、http://blog.csdn.net/kingzone_2008/article/details/9220691

2、http://pengcqu.iteye.com/blog/487538

3、http://www.runoob.com/java/java-stringbuffer.html———-


http://crazyandcoder.github.io/