为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

在Java开发中,最简单最常用的就是用+号来拼接字符串:

String boy = "lhc";

String girl = "amy";

String love = boy + girl;

反编译后内容如下:

String boy = "lhc";

String girl = "amy";

String love = (new StringBuilder()).append(boy).append(girl).toString();


通过查看反编译以后的代码,可以发现,字符串常量在拼接的时候是将String转成StringBuilder后,

使用其append进行处理,StringBuilder 的 append 方法就是第二个常用的字符串拼接其实他是和String一样也是封装了一个字符数组char[]value,只是与String不同的是,他不是final,所以是可以修改的。


其 append() 方法源码如下:

public StringBuilder append(String str) {

  super.append(str);

  return this;

}


 该类继承了 AbstractStringBuilder 类,看下其 append() 方法:

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;

}


 首先判断拼接的字符串 str 是不是 null,如果是,调用 appendNull() 方法进行处理,appendNull() 方法的源码如下:

private AbstractStringBuilder appendNull() {

  int c = count;

  ensureCapacityInternal(c + 4);

  final char[] value = this.value;

  value[c++] = 'n';

  value[c++] = 'u';

  value[c++] = 'l';

  value[c++] = 'l';

  count = c;

  return this;

}


 如果字符串 str 不为 null,则判断拼接后的字符数组长度是否超过当前数组长度,如果超过,则调用 Arrays.copyOf() 方法进行扩容并复制,ensureCapacityInternal() 方法的源码如下:

private void ensureCapacityInternal(int minimumCapacity) {

  if (minimumCapacity - value.length > 0) {

    value = Arrays.copyOf(value,newCapacity(minimumCapacity));

   }

}

暂无评论