字符串连接:concat() vs "+"操作符

假设字符串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);
    }
}

Niyaz是正确的,但也值得注意的是,特殊的+运算符可以被Java编译器转换为更有效的东西。 Java有一个StringBuilder类,它表示一个非线程安全的、可变的String。 当执行一堆字符串连接时,Java编译器会默默地将其转换为

String a = b + c + d;

转换成

String a = new StringBuilder(b).append(c).append(d).toString();

这对于大字符串来说,效率明显更高。 据我所知,当你使用concat方法时,这种情况不会发生。

然而,当把一个空的字符串连接到一个现有的字符串上时,concat方法的效率更高。 在这种情况下,JVM不需要创建一个新的String对象,可以简单地返回现有的String对象。 参见concat文档以确认这点。

因此,如果你非常关心效率,那么你应该在连接可能为空的字符串时使用concat方法,否则就使用+。 然而,性能上的差异应该是可以忽略不计的,你可能永远都不应该担心这个问题。

评论(3)

+操作符可以在一个字符串和一个字符串、char、整数、双数或浮点数的数据类型值之间工作。它只是在连接前将值转换为其字符串表示。

concat操作符只能对字符串进行操作。它检查数据类型的兼容性,如果它们不匹配,就会抛出一个错误。

除了这一点,你提供的代码做了同样的事情。

评论(0)

我不认为如此。

a.concat(b)是在String中实现的,我认为从早期的java机器开始,这个实现没有什么变化。+操作的实现取决于Java版本和编译器。目前+是用StringBuffer实现的,以使操作尽可能快。也许在未来,这将会改变。在早期版本的java中,对字符串的+操作要慢得多,因为它会产生中间结果。

我猜想+=是用+来实现的,也是类似的优化。

评论(2)