我试图在String中连接String数组值,下面的代码不起作用
private void newString() {
String str = "Split me";
String[] tokens = str.split("[ ]+");
String newStr = new String();
for(int i=0; i<tokens.length; i++){
newStr.concat(tokens[i]);
}
System.out.println("NEW STRING IS : " + newStr);
}
public static void main(String[] args){
Main m = new Main();
m.newString();
}
答案 0 :(得分:10)
当您致电newStr.concat(tokens[i]);
时,不修改newStr
,它会返回一个新的String
,这是连接的结果。你没有对结果做任何事情。
您需要执行以下操作:newStr = newStr.concat(tokens[i]);
String
是java中的不可变类型,因此它的方法就是这样,返回一个新的String
对象。考虑使用(可变)StringBuilder
代替。 StringBuilder
维护了一个可以增长的内部缓冲区,因此避免了使用连接和不可变String
带来的不必要的Strings
副本。
答案 1 :(得分:7)
String
是不可变的。当然,String.concat
会返回全新的String
。
...创建一个新的
String
对象,表示一个字符序列,它是由此String
对象表示的字符序列和由参数字符串表示的字符序列的串联。
您尝试这样做的方式,代码应该看起来像......
String glued = "";
for (final String token : tokens) {
glued = glued.concat(token);
}
现在,我对这种方法的问题在于你正在做{em>批次的String
数据副本。每个concat
复制glued
中的所有数据以及token
中的数据。现在,考虑一下它的含义...我不是过早优化的粉丝,但我认为实现这一目标的合理方法是使用StringBuilder
,如下所示......
final StringBuffer buf = new StringBuffer();
for (final String token : tokens) {
buf.append(token);
}
final String glued = buf.toString();
答案 2 :(得分:2)
我尝试使用StringBuilder修复它,这是新代码。
private void newString() {
String str = "Split me";
String[] tokens = str.split("[ ]+");
StringBuilder newStr = new StringBuilder();
for(int i=0; i<tokens.length; i++){
newStr.append(tokens[i]);
}
System.out.println("NEW STRING IS : " + newStr);
}