AbstractStringBuilder

StringBuffer 类和 StringBuilder 类都继承自 AbstractStringBuilder 类。
string.svg
AbstractStringBuilder 类中用一个 byte 数组保存字符串。

  1. byte[] value; // JDK 8 is a char array

String 类相比,该数组并没有被 final 关键字修饰。

append 方法

AbstractStringBuilder 类定义了多个 append() 方法, StringBuilder 类和 StringBuffer 类都覆写了这些方法。

  • StringBuilder 类
    1. public StringBuilder append(String str) {
    2. super.append(str);
    3. return this;
    4. }
  • StringBuffer 类
    1. public synchronized StringBuffer append(String str) {
    2. toStringCache = null;
    3. super.append(str);
    4. return this;
    5. }

可见 StringBuilder 类和 StringBuffer 类非常相似,仅仅是后者的方法用 synchronized 关键字进行了修饰,即 StringBuffer 是线程安全的,而 StringBuilder 不是线程安全的。

StringBuilder or +

在循环体内,字符串的链接方法应该使用 StringBuilderappend 方法,而不是使用 + 操作符。

  1. String str = "start";
  2. // 反例
  3. for (int i = 0; i < 100; i++) {
  4. str = str + "hello";
  5. }
  6. // 正例
  7. StringBuilder stringBuilder = new StringBuilder(str);
  8. for (int i = 0; i < 100; i++) {
  9. stringBuilder.append("hello");
  10. }