字符串连接:concat() vs "+" 运算符

586

假设有字符串a和b:

a += b
a = a.concat(b)

它们在背后是一样的吗?

这里提供了concat的反编译作为参考。我想也能反编译+运算符,以了解其功能。

public String concat(String s) {

    int i = s.length();
    if (i == 0) {
        return this;
    }
    else {
        char ac[] = new char[count + i];
        getChars(0, count, ac, 0);
        s.getChars(0, i, ac, count);
        return new String(0, count + i, ac);
    }
}

3
我不确定 + 是否可被反编译。 - Galen Nare
1
使用 javap 命令来反汇编一个 Java 类文件。 - Hot Licks
由于“不可变性”,您应该使用StringBufferStringBuilder(线程不安全但更快) - Ujjwal Singh
https://dzone.com/articles/concatenating-strings-in-java-9 - user9999
12个回答

1
当使用 + 运算符时,随着字符串长度的增加,速度会逐渐减慢,但是使用 concat 时,速度更加稳定,最好的选择是使用 StringBuilder 类来保持速度稳定。

我想你可以理解为什么。但创建长字符串的绝佳方式是使用 StringBuilder() 和 append(),无论哪种方式速度都是不可接受的。


1
使用 + 运算符等同于使用 StringBuilder(https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.18.1) - ihebiheb
@ihebiheb 或者 StringBuffer - NanoNova
2
@ihebiheb “字符串连接运算符的实现取决于Java编译器的自主选择,只要编译器最终符合Java™语言规范。例如,javac编译器可能使用StringBuffer、StringBuilder或java.lang.invoke.StringConcatFactory来实现运算符,具体取决于JDK版本(...)。 ” https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html - kasptom

0
请注意,当 s 为 null 时,s.concat("hello"); 将导致 NullPointereException。在 Java 中,+ 运算符的行为通常由左操作数决定: System.out.println(3 + 'a'); //100 然而,字符串是一个例外。如果任一操作数是字符串,则预期结果将是字符串。这就是为什么 null 被转换为 "null" 的原因,即使您可能期望抛出 RuntimeException

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