幾種拼接字串的效率與區別
程式中拼接字串是非常常見的操作,一般有直接通過+號拼接,或者使用concat()方法拼接、String.join()、StringUtils.join()、StringBuffer、StringBuilder的append()方法,後兩種之前討論過,不做過多贅述。
+拼接
直接使用“+”拼接字串,方便簡單,程式碼容易理解,但只適用於需要拼接的字串比較少的情況,當字串較多時,效率很低。
可以使用“+”將字串與數值相拼接。
concat()方法
String類的concat()方法也可以用於拼接字串,原始碼如下:
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);
}
從原始碼可以看出:concat()拼接的原理是使用Arrays.copyOf()方法複製了一個新char[]陣列,再返回一個新String。因此concat()方法也只適用於字串比較少的情況,因為當字串很多時,會建立很多新物件。concat()比“+”效率稍微高點,但只能用於拼接字串。
StringUtils.join()
使用StringUtils.join()方法需要引入org.apache.commons.lang3包,原始碼如下:
public static String join(Iterator<?> iterator, String separator) {
if(iterator == null) {
return null;
} else if(!iterator.hasNext()) {
return "";
} else {
Object first = iterator.next();
if (!iterator.hasNext()) {
String buf1 = ObjectUtils.toString(first);
return buf1;
} else {
StringBuilder buf = new StringBuilder(256);
if(first != null) {
buf.append(first);
}
while(iterator.hasNext()) {
if(separator != null) {
buf.append(separator);
}
Object obj = iterator.next();
if(obj != null) {
buf.append(obj);
}
}
return buf.toString();
}
}
}
StringUtils.join()需要傳兩個引數,第一個引數陣列或者集合,第二個引數為拼接符。
有原始碼可以看出,方法內部使用的是StringBuilder來拼接字串的,效率很高。
String.join()
String.join()是java8新加的方法,原始碼如下:
public static String join(CharSequence delimiter,
Iterable<? extends CharSequence> elements) {
Objects.requireNonNull(delimiter);
Objects.requireNonNull(elements);
StringJoiner joiner = new StringJoiner(delimiter);
for (CharSequence cs: elements) {
joiner.add(cs);
}
return joiner.toString();
}
可以看出,拼接時主要是呼叫了StringJoiner.add()方法,接著往下看;
public StringJoiner add(CharSequence newElement) {
prepareBuilder().append(newElement);
return this;
}
可以看到,add()方法中呼叫了prepareBuilder(),接著往下看;
private StringBuilder prepareBuilder() {
if (value != null) {
value.append(delimiter);
} else {
value = new StringBuilder().append(prefix);
}
return value;
}
從這裡已經可以看出來,String.join()方法內部也是建立了StringBuilder物件,使用了StringBuilder來拼接的字串。
注意:String.join()與StringUtils.join()方法的區別是:String.join()第一個引數為拼接符,第二個是資料或集合,而且陣列或集合必須是繼承CharSequence物件才行。