附加字符串时速度问题

Sta*_*ust 6 java string performance

每当我尝试在字符串中添加数字时:

String s=new String();

 for(int j=0;j<=1000000;j++)

    s+=String.valueOf(j);
Run Code Online (Sandbox Code Playgroud)

我的程序正在添加数字,但速度很慢.但当我改变我的程序并使它像:

StringBuffer sb=new StringBuffer();

for(int j=0;j<=1000000;j++)

sb.append(String.valueOf(j));
Run Code Online (Sandbox Code Playgroud)

我很快得到了结果.为什么会这样?

Tho*_*zer 6

s+=String.valueOf(j);需要在String每次调用时分配一个新对象,这很昂贵.在StringBuffer只需要增加一些内部表示,当含有字符串过大,这经常发生要少得多.

如果您使用的StringBuilder是一个非同步版本的StringBuffer,它可能会更快.

需要注意的一点是,虽然这确实适用于循环和许多其他情况,但它并不一定适用于使用以下连接字符串的所有情况+:

String helloWorld = getGreeting() + ", " + getUsername() + "!";
Run Code Online (Sandbox Code Playgroud)

在这里,编译器可能会以它认为合适的方式优化代码,这可能会也可能不会创建StringBuilder,因为这也是一项昂贵的操作.