每当我尝试在字符串中添加数字时:
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));
我很快得到了结果。为什么会这样?
答案 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)
从Heinz Kabutz的Javaspecialists时事通讯看看这个:
http://www.javaspecialists.eu/archive/Issue068.html
以及后来的文章:
http://java.sun.com/developer/technicalArticles/Interviews/community/kabutz_qa.html