标签:bsp getchar concat nal length abstract 扩容 this 转换
1、加号
加号拼接字符串底层是调用StringBuilder来实现的,”a” + “b”等效于如下代码:
String a = "a"; StringBuilder ab= new StringBuilder(); ab.append(a).append("b"); String str = ab.toString();
但并不是说直接用加号拼接就可以达到StringBuilder的效率了,因为用加号每拼接一次都会新建一个StringBuilder对象,并且最后toString()方法还会生成一个String对象。在循环拼接十万次的时候,就会生成十万个StringBuilder对象,十万个String对象,效率不是很好。
2、concat拼接
查看底层源码,发现concat其实就是申请一个char类型的buf数组,将需要拼接的字符串都放在这个数组里,最后再转换成String对象。
public String concat(String str) { int otherLen = str.length(); if (otherLen == 0) { return this; } int len = value.length; char buf[] = Arrays.copyOf(value, len + otherLen); str.getChars(buf, len); return new String(buf, true); }
3、StringBuilder/StringBuffer
通过调用父类AbstractStringBuilder的append方法来拼接字符串,StringBuffer的append方法加了sychronized关键字,因此线程是安全的,而StringBuilder线程是不安全的。
查看源码发现其主要原理也是利用char数组保存字符,通过ensureCapacityInternal方法来保证数组容量可用还有扩容。
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;
}
标签:bsp getchar concat nal length abstract 扩容 this 转换
原文地址:https://www.cnblogs.com/yamiya/p/12375353.html