1. 程式人生 > >幾種拼接字串的效率與區別

幾種拼接字串的效率與區別

程式中拼接字串是非常常見的操作,一般有直接通過+號拼接,或者使用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物件才行。