我有一个连接字符串的代码。但是,由于某种原因,最终字符串不是所需字符串的组合。请考虑以下代码:
//cusEmail is of type String[]
String toList = "";
for(i=0; i < cusEmail.length - 1; i++) {
toList.concat(cusEmail[i]);
toList.concat("; ");
System.out.println(cusEmail[i]);
}
toList.concat(cusEmail[i]);
System.out.println(toList);
第一个sout语句正确显示cusEmail [i]中的字符串。但是,一旦连接,第二个sout显示空白/空白。有什么理由吗?我能正确连接吗?
答案 0 :(得分:3)
String 不可变。这意味着toList.concat(..)
不会更改toList
。相反,它返回一个新的字符串:
toList = toList.concat(..);
但是,建议使用StringBuilder.append(..)
:
StringBuilder toList = new StringBuilder();
for (...) {
sb.append(emails[i]);
sb.append("; ");
}
...
return sb.toString();
更好的(在代码重用方面)方法是使用实用程序来连接带分隔符的字符串。像ArrayUtils.join(emailsArray, "; ")
;(来自commons-lang)
答案 1 :(得分:1)
String
个对象是不可变的。在concat
上调用toList
不会更改toList
对象的值。相反,concat
将返回一个不同的String
对象,它是两个字符串的串联。对于您的示例,您需要将concat
变量中每个调用的结果存储到toList
。
例如,
toList = toList.concat(cusEmail[i]);
使用concat
方法的另一种方法是使用连接运算符。这可能会更好看。
toList = toList + cusEmail[i];
但请注意,每次将一个字符串连接到另一个字符串时,需要创建一个包含两个原始字符串中信息副本的新String
对象。这可能是一种构建字符串的昂贵方式,当它在一个循环中完成时,例如你所拥有的。无论您使用concat
方法还是连接运算符,都是如此。另一种方法是使用StringBuilder
对象来构建字符串。
StringBuilder toList = new StringBuilder();
for(i=0; i < cusEmail.length - 1; i++) {
toList.append(cusEmail[i]);
toList.append("; ");
System.out.println(cusEmail[i]);
}
toList.append(cusEmail[i]);
System.out.println(toList.toString());