4

我在 java 中使用过 String、StringBuilder 和 StringBuffer。
我在从效率的角度思考的时候想到了这个问题。

字符串连接中使用“+”会影响效率吗?

4

5 回答 5

6

是的,但是很少,大多数时候都无所谓。

对字符串常量使用“+”是最有效的,因为编译器可以执行连接。

如果要连接两个字符串,该concat方法是最有效的,因为它避免使用 StringBuilder。

除了向后兼容之外,几乎没有使用 StringBuffer 的好理由。StringBuilder 或 StringWriter 是更好的选择。但是,它仍然比 JDK 中的 StringBuilder 更频繁地显式使用:P

StringBuffer 已死,StringBuffer 万岁

于 2011-08-03T13:51:23.480 回答
4

如果您在单个语句中进行连接,那么这无关紧要,因为编译器/JIT 编译器将使用StringBuilder.

所以"a"+b+"c"会优化到(new StringBuilder("a").append(b).append("c")).toString()

但是,如果您在循环中连接大量Strings,请务必明确使用 a StringBuilder,因为它会显着加快您的程序。

String a = "";

for( int i = 0; i < 1000000; i++ )
    a += i;

应该改为

StringBuilder sb = new StringBuilder();

for( int i = 0; i < 1000000; i++ )
    sb.append(i);

String a = sb.toString();
于 2011-08-03T13:53:06.727 回答
1

有点是,但仍然不是

来自 JLS,15.18.1.2

字符串连接的优化

实现可以选择在一个步骤中执行转换和连接,以避免创建然后丢弃中间 String 对象。为了提高重复字符串连接的性能,Java 编译器可以使用 StringBuffer 类或类似技术来减少通过计算表达式创建的中间 String 对象的数量。

对于原始类型,实现还可以通过直接从原始类型转换为字符串来优化包装对象的创建。

于 2011-08-03T13:51:10.320 回答
1

在您的示例中:

" Does +" + " use in String concatenation affect efficiency? "

我们必须文字字符串,它可能会被编译器替换,所以这会比 StringBuffer/append/toString 更快。

但与什么相比,效率/速度更快?代码执行?代码编写?读码?

自从读了一个

"Foo = " + foo;

很简单,我会推荐它,只要它不重复一百万次,或者“s += s2;” 重复了一百次。

尤其,

System.out.println ("Player " + n + " scores " + player[n].score); 

比可读性好得多

System.out.println (new StringBuffer ("Player ").append ((Integer.valueOf (n)).toString ().append (" scores ").append (...

只是在需要高性能的应用程序中避免它,或者连接非常大量的字符串,或者大量递归。

于 2011-08-03T14:13:17.000 回答
-2

如果您使用 '+' 的多次连接,那么在某种程度上是肯定的。因为当您执行 String a + String b 时,它实际上在内部创建了一个 StringBuffer 对象并使用 StringBuffer 的 append()。因此,每次执行“+”时,都会创建一个新的临时 StringBuffer 对象,用“a”初始化,然后附加“b”,然后将其转换为字符串对象。

因此,如果您需要多个连接,您应该创建一个 StringBuffer(thread-safe)/StringBuilder(not thread-safe) 对象并继续追加,这样就可以避免一次又一次地创建 StringBuffer 对象。

于 2011-08-03T14:35:04.850 回答