StringBuilder.append的性能

时间:2017-03-10 14:41:46

标签: java string performance stringbuffer

建议(PMD规则AppendCharacterWithChar)使用StringBuilder.append(char)而不是StringBuilder.append(String)。我同意这一点。

但是,如果我想附加"='""</"之类的(短)字符串,则使用

StringBuilder.append('=').append('\'')

更好(更快)
StringBuilder.append("='")

1 个答案:

答案 0 :(得分:5)

The code for the two methods is

public synchronized StringBuffer append(char c) {
    toStringCache = null;
    super.append(c);
    return this;
}

public AbstractStringBuilder append(char c) {
    ensureCapacityInternal(count + 1);
    value[count++] = c;
    return this;
}

VS

public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}

一些更多的工作是由append(String)版本完成的,但它是微不足道的:

  • 一些空检查;
  • 检索长度;
  • 复制一系列字符。

但这并不会产生太大的影响,至少对非常短的字符串而言。

这里更显着的性能成本是StringBuffer方法为synchronized:为了调用任一过载,必须在StringBuffer上获取监视器。这需要一些时间 - 我会想到比额外的工作更长的时间。并且调用append(char)意味着您必须重复获取此监视器。

这里真正的性能是针对显示器和键盘之间的笨拙 - 你。编写可读的代码:append(String)表单方式比一遍又一遍地调用append(char)表单更容易阅读。

另外,如果可以,请使用StringBuilder - 这样可以完全避免同步问题。