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