String、StringBuilder、StringBuffer 的区别?

String:用于字符串操作,属于不可变类;【补充:String 不是基本数据类型,是引用类型,底层用 char 数组实现的】

StringBuilder:与 StringBuffer 类似,都是字符串缓冲区,但线程不安全;

StringBuffer:也用于字符串操作,不同之处是 StringBuffer 属于可变类,对方法加了同步锁,线程安全

StringBuffer的补充

说明:StringBuffer 中并不是所有方法都使用了 Synchronized 修饰来实现同步:

@Overridepublic StringBuffer insert(int dstOffset, CharSequence s) {  
    // Note, synchronization achieved via invocations of other StringBuffer methods  
    // after narrowing of s to specific type  
    // Ditto for toStringCache clearing  
    super.insert(dstOffset, s);  
    return this;
}

执行效率:StringBuilder > StringBuffer > String

发表评论

后才能评论

评论(4)

  • 一蓑烟雨 普通 2022-09-28 9:52 上午

    String:用于字符串操作,属于不可变类
    StringBuilder:用于字符串操作,可变类,线程不安全
    StringBuffer:用于字符串操作,可变类,对方法加了同步锁,线程安全
    执行效率:StringBuilder > StringBuffer > String

  • mpweixin用户 普通 2022-04-02 12:56 下午

    线程安全:
    当多个线程访问某一个类(对象或方法)时,对象对应的公共数据区始终都能表现正确,那么这个类(对象或方法)就是线程安全的

  • 汉堡包 普通 2021-10-24 6:23 下午

    在1.8及以前,String类底层使用的是char[],1.9之后改成了byte[]
    因为字符串较多是拉丁字母,只需要一个字节就可以存储,char多出来的一个字节容易浪费,gc更频繁

    String不可变是因为char[]数组被final修饰了,而StringBuilder和StringBuffer没有
    (继承了AbstractStringBuilder中的数组)

    为了实现线程同步,需要牺牲一部分的效率,所以StringBuilder的效率要比StringBuffer高

    • 光辉 普通 @ 汉堡包 2022-02-27 2:43 下午

      String不可变不是因为char数组被final修饰了,修饰了后最多是数组的引用不可变,然而数组元素还是可变的,应该是String类没有提供修改的API