Java 之详解字符串拼接(十四)
十四、详解字符串拼接
14.1、+号操作
+ 号操作符其实被 Java 在编译的时候重新解释了,换一种说法就是,+ 号操作符是一种语法糖,让字符串的拼接变得更简便了。
class Demo{public static void main(String[] args){String str1 = "浩妹";String str2 = "好美";System.out.println(str1 + str2);}
}
14.2、String.concat拼接字符串
String 类的
concat()方法,有点像 StringBuilder 类的append()方法。
String str1 = "好美";
String str2 = "浩妹";
System.out.println(str1.concat(str2));
看一下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);
}
如果拼接的字符串长度为0,那么返回原来的数组
将原字符串的字符数组value复制到变量buf数组中
把拼接的字符串 str 复制到字符数组 buf 中,并返回新的字符串对象。
和
+号操作符相比,concat()方法在遇到字符串为 null 的时候,会抛出 NullPointerException,而“+”号操作符会把 null 当做是“null”字符串来处理。如果拼接的字符串是一个空字符串(""),那么 concat 的效率要更高一点,毕竟不需要
new StringBuilder对象。如果拼接的字符串非常多,
concat()的效率就会下降,因为创建的字符串对象越来越多。
14.3、String.join拼接字符串
String 类有一个静态方法
join(),可以这样来使用
String str1 = "浩妹";
String str2 = "好美";
String str3 = String.join("", str1, str2);
System.out.println(str3);
第一个参数为字符串连接符,比如说:
String message = String.join("-", "浩妹", "太特么", "有趣了");
//输出
浩妹-太特么-有趣了
来看一下join的源码
public static String join(CharSequence delimiter, CharSequence... elements) {Objects.requireNonNull(delimiter);Objects.requireNonNull(elements);// Number of elements not likely worth Arrays.stream overhead.StringJoiner joiner = new StringJoiner(delimiter);for (CharSequence cs: elements) {joiner.add(cs);}return joiner.toString();
}
里面新建了一个叫 StringJoiner 的对象,然后通过 for-each 循环把可变参数添加了进来,最后调用
toString()方法返回 String。
14.4、StringUtils.join拼接字符串
实际的工作中,
org.apache.commons.lang3.StringUtils的join()方法也经常用来进行字符串拼接。
String str1 = "浩妹";
String str2 = "好美";
StringUtils.join(str1, str2);
该方法不用担心 NullPointerException。
StringUtils.join(null) = null
StringUtils.join([]) = ""
StringUtils.join([null]) = ""
StringUtils.join(["a", "b", "c"]) = "abc"
StringUtils.join([null, "", "a"]) = "a"
来看一下源码
public static String join(final Object[] array, String separator, final int startIndex, final int endIndex) {if (array == null) {return null;}if (separator == null) {separator = EMPTY;}
final StringBuilder buf = new StringBuilder(noOfItems * 16);
for (int i = startIndex; i < endIndex; i++) {if (i > startIndex) {buf.append(separator);}if (array[i] != null) {buf.append(array[i]);}}return buf.toString();
}
内部使用的仍然是 StringBuilder。
