Java基础Demo01——String,StringBuffer,StringBuilder的区别

String,StringBuffer,StringBuilder的区别

  1. String由于final关键字的修饰,类不可被继承,对象不可被改变
    Java基础Demo01——String,StringBuffer,StringBuilder的区别
    Java基础Demo01——String,StringBuffer,StringBuilder的区别
    而在StringBuffer和StringBuilder中,两者都继承自AbstractStringBuilder抽象类,对象底层仍旧和String一样是一个byte数组,但是这里却没有final关键字修饰
    故:StringBuffer和StringBuilder虽不可被继承,但可被改变。
    Java基础Demo01——String,StringBuffer,StringBuilder的区别
    Java基础Demo01——String,StringBuffer,StringBuilder的区别
    Java基础Demo01——String,StringBuffer,StringBuilder的区别
  2. String中的对象是不可变的,显然线程安全
    StringBuffer 的所有公开方法都是 synchronized 修饰,线程也是安全的
    StringBuilder对象既可改变,也无同步锁限制,故线程不安全
    注:同步锁Synchronized及其实现原理
  3. String由于在对字符串进行操作时一般只需要创建String一个对象,所以在数据量较小的情况下性能是优于StringBuffer和StringBuilder的
    但在数据量较大的情况下,由于String对象不可改变,每一次对字符串操作都会创建一个新的String对象,这将占用极大的内存空间并消耗掉大量时间。而StringBuilder与StringBuffer相比,没有安全锁机制,性能会更高。故在数据量较大的情况下,String<StringBuffer<StringBuilder
    总结:
    String-数据量小的情况下适用
    StringBuffer-数据量较大的多线程情况下适用
    StringBuilder-数据量较大的单线程情况下适用
  4. StringBuffer在细节上的优化:
    StringBuffer与StringBuilder相比设立了缓冲区:
    Java基础Demo01——String,StringBuffer,StringBuilder的区别
    Java基础Demo01——String,StringBuffer,StringBuilder的区别
    tostring返回的最后一个值的缓存。每当修改StringBuffer时清除。