在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));
}
}