在Java中将常量字符串附加到变量字符串的最有效方法?

时间:2012-05-01 18:46:25

标签: java string loops concatenation

目前在我的代码中,我在for循环中有类似于:

的东西
bstr = bstr + x.charAt(i) + x.charAt(i>>4) + x.charAt(i>>8);

其中i是整数,循环变量和x是静态最终常量字符串。 bstr可以是KB的顺序。

由于

4 个答案:

答案 0 :(得分:5)

执行此操作的一种高效方法是使用StringBuilder来连接字符串:

StringBuilder builder = new StringBuilder();
for(int i = 0; i < count; i++){
    builder.append(x.charAt(i));
    builder.append(x.charAt(i>>4));
    builder.append(x.charAt(i>>8));
}

return builder.toString();

这种技术避免了在for循环中在串联之间存储字符串的所有副本的问题。

修改

或者这对你有用(一次不添加一个字符):

StringBuilder builder = new StringBuilder();
for(int i = 0; i < count; i++){
    builder.append(x);
}

return builder.toString();

答案 1 :(得分:1)

在循环之前创建StringBuilder并重复使用它:

StringBuilder sb = new StringBuilder();

while (someCondition) {
    ...
    sb.append(x.charAt(i))
      .append(x.charAt(i >> 4))
      .append(x.charAt(i >> 8));
    ...
}

bstr = sb.toString();

答案 2 :(得分:0)

使用StringBuilder并在循环时添加。

StringBuilder sb = new StringBuilder();
sb.append(bstr);
for(int i=0; i < somecondition; i++){
  sb.append(x.charAt(i)).append(x.charAt(i>>4)).append(x.charAt(i>>8));  
}
System.out.println(sb.toString());

答案 3 :(得分:0)

一种选择是使用StringBuilder类。它有一个char的内部数组,它会将你的内容附加到你调用toString方法,然后它会创建一个新的String对象。当然,由于它使用数组来存储你的角色,它可能会用完空间,此时它会将内容复制到一个新的更大的数组中。你可以通过最初给它一个足够大的容量来保存最终的String来避免这种情况。

// Create a new StringBuilder with an initial capacity that is a little larger than the final String
StringBuilder builder = new StringBuilder(estimatedSizeOfFinalString);
int i = 0;
while (loopConditionIsTrue) {
    builder.append(x.charAt(i)).append(x.charAt(i >> 4)).append(x.charAt(i >> 8);
}
String bstr = builder.toString();