StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
主要区别如下:
1. String是不可变的,而StringBuffer和StringBuilder是可变的
String因为是定义为final的,所以是线程安全的,而StringBuffer加了同步锁,所以也是线程安全的。
3. String是java.lang.String而StringBuffer和StringBuilder都是继承自AbstractStringBuilder(是一个抽象类)
执行速度
这三个类在进行操作时的速度关系为:StringBuilder > StringBuffer > String
由于String中进行操作时都会新建一个char[ ]数组代替原来的char[ ]数组,所以速度最慢
StringBuffer线程安全,每个方法都有synchronized同步阻塞,所以操作速度受影响
StringBuilder没有同步阻塞的限制,所以操作速度最快
使用场景
如果要操作少量的数据用 = String
单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
StringBuffer
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
常用方法
String都比较熟悉,这里只整理StirngBuffer/StringBuilder类的方法,这两个类大多数方法都是继承于AbstractStringBuilder父类
1、append(String str) 追加内容到当前StirngBuffer/StringBuilder对象的末尾,类似于字符串的连接
2、deleteCharAt(int k)删除指定位置的字符,然后将剩余的内容形成新的字符串
3、delete(int start, int end) 删除指定区间以内的所有字符,包含start,不包含end索引的区间
4、insert(int index, String str) 在StirngBuffer/StringBuilder对象指定位置中插入内容str,然后形成新的字符串
5、reverse() 将StirngBuffer/StringBuilde对象中的内容反转,然后形成新的字符串
参考链接:
https://blog.csdn.net/ls5718/article/details/51899027
https://blog.csdn.net/martinmateng/article/details/50808052
https://blog.csdn.net/m0_37241851/article/details/71056290