字符串操作:为什么方法1的效果不如方法2

时间:2019-05-01 00:14:04

标签: java string

我有一个问题,我必须以两种不同的方式连接两个或多个字符。方法1如下:

String s = "";
for( int i = 0; i < 10; ++i ){
StringBuffer t = new StringBuffer();
t.append( s );
t.append( i );
t.append( " " );
s = t.toString();
}

第二种方法是:

StringBuffer b = new StringBuffer();
for( int i = 0; i < 10; ++i ){
b.append( i );
b.append( ' ' );
}
String s = b.toString();

在书中(公开的编程访谈)中提到第二种方法的编码更有效。为什么会这样呢?是因为Stringbuffer的对象t最初不是在for循环内重复出现的。需要澄清。

3 个答案:

答案 0 :(得分:1)

方法1定义了一个新的StringBuffer,并在每次迭代时调用toString(),与方法2相比,方法2仅创建一次StringBuffer,并且仅调用一次toString(),因此使用了更多的操作和内存。

答案 1 :(得分:1)

您在这里。我的评论指出了第一种方法的额外开销。


String s = "";
for( int i = 0; i < 10; ++i ){

// create this for each iteration
StringBuffer t = new StringBuffer();

// extra method call to add string in progress
t.append( s ); 

t.append( i );

// more overhead appending string than a char
t.append( " " );

// convert StringBuffer to a string to append back in later
s = t.toString();
}

对于这两种方法,应优先使用StringBuilder而不是StringBuffer。当使用线程时,后者是首选的,因为它是同步的。因此,如果您不使用线程,请使用StringBuilder。

答案 2 :(得分:0)

您的方法1正在消耗大量不必要的内存,与方法2相比,它不是必需的。 即使您可以使用StringBuilder代替StringBuffer,您也可以阅读javadoc,这是为什么StringBuilder比StringBuffer快n以及为什么需要使用什么的原因。