文章

字符串拼接

字符串拼接

StringBuilder的append()

1
2
3
4
String s1 = "ha";
String s2 = "xi";
// 编译的时候被替换成 new StringBuilder(s1).append(s2).toString();
System.out.println(s1 + s2);
1
2
3
4
String s1 = "ha";
// +号也被编译成了append()
String s2 = s1 + "";
System.out.println(s2);
1
2
// 编译器在编译阶段就将其解析为了字符串常量haxi
String s = "ha" + "xi";
  • ==循环体内,拼接字符串最好使用 StringBuilder 的 append() 方法,而不是 + 号操作符==。循环体内如果用 + 号操作符的话,就会产生大量的 StringBuilder 对象,不仅占用了更多的内存空间,还会让 Java 虚拟机不停的进行垃圾回收,从而降低了程序的性能
1
2
3
4
5
6
7
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++) {
    String s1 = "ha";
    String s2 = "xi";
    sb.append(s1).append(s2);
}
System.out.println(sb);

String的concat

1
2
3
String s1 = "ha";
String s2 = "xi";
System.out.println(s1.concat(s2));
1
2
3
4
5
6
7
8
9
10
11
12
13
public String concat(String str) {
    if (str.isEmpty()) {
        return this;
    }
    int len = value.length;
    int otherLen = str.length();
    // 将原字符串的字符数组 value 复制到变量 buf 数组中
    char buf[] = Arrays.copyOf(value, len + otherLen);
    // 把拼接的字符串 str 复制到字符数组 buf 中
    str.getChars(buf, len);
    // 返回新的字符串对象
    return new String(buf, true);
}
  • concat() 方法在遇到字符串为 null 的时候,会抛出 NullPointerException,而“+”号操作符会把 null 当做是“null”字符串来处理

String的join()

1
2
3
4
5
String s1 = "ha";
String s2 = "xi";
String s3 = "he";
// 第一个参数为字符串连接符
System.out.println(String.join("-", s1, s2, s3));
1
2
3
4
5
6
7
8
9
10
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();
}
本文由作者按照 CC BY 4.0 进行授权