Java StringBuffer 和 StringBuilder 类


Java StringBuffer & StringBuilder 类

Java原生提供了两个类:StringBuffer和StringBuilder,用于字符串的操作。他们可以改变字符串的值,而不需要创建新的对象。

String与StringBuffer&StringBuilder的区别

StringBuffer和StringBuilder类是可变的,而String类是不可变的。

这是因为String类是被final修饰的,它的值是不能被改变的,每一次改变字符串,都会生成一个新的字符串对象,这个对象会占用一部分内存,该操作极其浪费资源。而StringBuffer和StringBuilder的内部处理逻辑和String有很大的区别,它们运用了动态数组的思想,所以它们都是可以改变其内部值的,当长度变大的时候就会自动扩充数组存储空间,自动调整缓存区的大小。

StringBuffer与StringBuilder的区别在于:方法前者是属于同步的,即线程安全的,而后者则不是。 在同一时间段内,只能有一个线程对StringBuffer进行操作,在执行效率上要比StringBuilder低,所以平常开发中尽量使用StringBuilder类。

StringBuffer类

StringBuffer类创建的对象其实就是一个字符串缓存区域,该类有一些可以改变缓存区内容的方法,支持在缓存区的末尾插入字符、串等操作,还可以根据索引来删除缓存区中的字符、串等操作。它的全部方法都带有同步方法修饰符,是线程安全的,可以在任意数量线程中同时执行;但要注意的是,在多个线程频繁使用的情况下,比使用StringBuilder的效率会降低很多。

StringBuffer类常用的方法

  • append():将指定的字符串添加到此字符串的末尾。此方法通过任何一种方法都可以被重载。
public StringBuffer append(Object obj);
public StringBuffer append(String str);
public StringBuffer append(StringBuffer sb);
public StringBuffer append(char[] str);
public StringBuffer append(CharSequence s);
  • insert():将指定的字符串插入此字符序列中。此方法通过任何一种方法都可以被重载。
public StringBuffer insert(int index, char[] str);
public StringBuffer insert(int offset, Object obj);
public StringBuffer insert(int offset, String str);
  • reverse():将此字符序列用其反转形式取代。
public StringBuffer reverse();
  • delete():移除此序列中子字符串的字符。字串由指定的 start 和 end 参数定义。移除一个字符时,该序列中所有后续字符都会向左移动一个字符。
public StringBuffer delete(int start, int end);
  • replace():将指定子串用新字符串替换。子串从指定的 start 开始,到索引 end - 1 处的字符结束。
public StringBuffer replace(int start, int end, String str);

StringBuilder类

StringBuilder类就像StringBuffer一样,可以操作字符串,它是没有同步处理,却有长度的概念。StringBuilder是推荐使用的,因为在单线程模式下性能更优秀。

StringBuilder类常用的方法

StringBuilder类具有与StringBuffer类相同的方法,但是它没有被同步处理,因此在单线程程序中速度更快。

  • append(same as StringBuffer)

  • insert(same as StringBuffer)

  • replace(same as StringBuffer)

  • substring(same as String)

  • ensureCapacity():保证容量。

public synchronized void ensureCapacity(int minimumCapacity);
  • capacity():返回当前容量。
public synchronized int capacity();
  • length():返回长度(字符数)。
public synchronized int length();
  • setLength():设置长度。
public synchronized void setLength(int newLength);

总结

StringBuffer和StringBuilder类都是Java中用于操作字符串的类,区别在于StringBuffer是线程安全的,而StringBuilder则不是。在单线程情况下,使用StringBuilder效率更高,但是如果有多个线程需要修改字符串,那就必须使用StringBuffer类,否则可能会引发线程安全问题。这两个类提供了一系列实用的方法,方便处理和操作字符串。