String.join()vs其他字符串连接操作

时间:2015-08-04 19:08:11

标签: java string java-8

我已经快速阅读了Java8 String api文档。

现在我对String.join()方法很好奇,以便连接/连接字符串。

这种例子让我更好地理解:

//Old way:
String str1 = "John";
String str2 = "Doe";
String result = str1 + " " +str2;
//or by using str1.concat(str2);

//New way:
String result = String.join(" ", str1, str2);

但是,我不明白我应该使用哪一个。这两个过程之间是否有任何表现或其他差异。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:20)

String.join依赖于类StringJoiner,它本身依赖于内部StringBuilder来构建连接的字符串。

因此,性能方面与使用StringBuilder并附加到+或使用StringBuilder链(现在转换为String.join操作链)非常相似由编译器)。

+的重要性不是String.concatString.split的一般替代品,而是作为"反向操作"一个concat操作。在这种情况下更有意义 - 当你有一堆字符串想要使用分隔符连接在一起时 - 而不是替换"a/b/c/d"

也就是说,当您拥有"(a+b+c+d)"abc时,可以构建类似dString.join的输出数组或列表,StringJoinerQWidget将使操作清晰可读。

答案 1 :(得分:2)

str1 + " " + str2在内部转换为:

StringBuffer tmp1 = new StringBuffer();
tmp1.append(str1);
tmp1.append(" ");
String tmp2 = tmp1.toString();
StringBuffer tmp3 = new StringBuffer();
tmp3.append(tmp2);
tmp3.append(str2);
String result = tmp3.toString();

str1.concat(str2)不会产生相同的结果,因为两个字符串之间不存在空格。

加入应该相当于

StringBuffer tmp1 = new StringBuffer();
tmp1.append(str1);
tmp1.append(" ");
tmp1.append(str2);
String result = tmp.toString();

因此更快。

答案 2 :(得分:1)

我们可以使用StringJoiner(Java8 +)

import java.util.StringJoiner;

public class StringJoinerTest {

public static final String FILESEPARATOR = ", ";

public static void main(String[] args) {

    StringJoiner sj = new StringJoiner(FILESEPARATOR);
    sj.add("Test1");
    sj.add("Test2");
    sj.add("Test3");
    System.out.println(sj);
   }
}

输出为

Test1, Test2, Test3