String.join()与其他字符串连接操作的区别

21
我迅速阅读了Java8的String API文档。现在我对String.join()方法进行了一些了解,它可以用于连接字符串。不过这个例子帮助我更好地理解:

我快速阅读了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);

然而,我不明白应该使用哪个。这两个过程之间是否有性能或其他差异。

任何帮助将不胜感激。


2
concat 不考虑分隔符,而 join 可以在多个字符串上执行。另外请注意,使用 + 连接多个字符串可能不会产生 concat 操作。 - E net4
3个回答

31

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

因此从性能上来看,String.join 和使用 StringBuilder 并进行追加或使用一系列 + 的效果基本相同(现在这些操作都被编译器转换为 StringBuilder 操作)。

但是 String.join 的意义不在于一般替换 +String.concat,而在于作为 String.split 操作的“反向操作”。在这种情况下,它更有意义——当您有一堆要使用分隔符连接在一起的字符串时——而不是作为 concat 的替代品。

也就是说,如果您有一个数组或列表中的 abcd,想要构建像 "a/b/c/d""(a+b+c+d)" 这样的输出,使用 String.joinStringJoiner 将使操作变得清晰和易读。


7
请注意,任何地方都没有明确说明StringJoiner依赖于StringBuilder。特别是在OpenJDK9中,它经过了优化,不再使用StringBuilder - Tagir Valeev
1
@TagirValeev 是的,我是根据阅读当前源代码来得出那些信息的。 - RealSkeptic

3

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)不会产生相同的结果,因为两个字符串之间没有空格。

join应该等同于

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

因此可以更快速。

11
“+” 被转换为 StringBuilder,而不是 StringBuffer。对于 join 同样如此。 - Jeffrey

0
我们可以使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接