附加字符串时速度问题

时间:2010-01-13 09:36:14

标签: java string performance

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

String s=new String();

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

    s+=String.valueOf(j);

我的程序正在添加数字,但速度很慢。但是当我改变我的程序并使其成为:

StringBuffer sb=new StringBuffer();

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

sb.append(String.valueOf(j));

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

4 个答案:

答案 0 :(得分:6)

s+=String.valueOf(j);每次调用时都需要分配一个新的String对象,这很昂贵。当包含的字符串太大时,StringBuffer只需要增加一些内部表示,这种情况发生得更少。

如果使用StringBuilder,这可能会更快,这是StringBuffer的非同步版本。

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

String helloWorld = getGreeting() + ", " + getUsername() + "!";

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

答案 1 :(得分:1)

因为s + =“string”会创建一个新实例。 String是不可变的。 StringBuffer或StringBuilder在不创建新实例的情况下添加String。

答案 2 :(得分:1)

在Java中,在.NET中,字符串是不可变的。它们在创建后无法更改。结果是使用+运算符将创建一个新字符串并将两个字符串的内容复制到其中。

每次空间用完时,StringBuffer都会将分配的空间加倍,以添加字符。从而减少了内存分配量。

答案 3 :(得分:1)