几种拼接字符串的效率与区别

程序中拼接字符串是非常常见的操作,一般有直接通过+号拼接,或者使用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 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对象才行。

你可能感兴趣的:(java基础)