【发布时间】:2012-05-01 18:46:24
【问题描述】:
目前在我的代码中,我在 for 循环中有一些类似于:
bstr = bstr + x.charAt(i) + x.charAt(i>>4) + x.charAt(i>>8);
其中 i 是一个整数和循环变量,x 是一个静态的最终常量字符串。 bstr 可以是 KB 的顺序。
谢谢
【问题讨论】:
标签: java string loops concatenation
目前在我的代码中,我在 for 循环中有一些类似于:
bstr = bstr + x.charAt(i) + x.charAt(i>>4) + x.charAt(i>>8);
其中 i 是一个整数和循环变量,x 是一个静态的最终常量字符串。 bstr 可以是 KB 的顺序。
谢谢
【问题讨论】:
标签: java string loops concatenation
执行此操作的一种有效方法是使用 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();
【讨论】:
a + b + c 等表达式编译为 new StringBuilder().append(a).append(b).append(c).toString()
StringBuilder 是实现此目的的好方法。但是,从 Java 5 开始,编译器可能会自动将连接转换为使用 StringBuilder:java.sun.com/developer/technicalArticles/Interviews/community/…
在循环之前创建一个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();
【讨论】:
使用 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());
【讨论】:
一种选择是使用StringBuilder 类。它有一个内部 char 数组,它会将您的内容附加到该数组中,直到您调用 toString 方法,此时它会创建一个新的 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();
【讨论】: