帮助调试字符串连接代码

时间:2010-04-16 10:50:29

标签: java debugging concatenation

我有一个连接字符串的代码。但是,由于某种原因,最终字符串不是所需字符串的组合。请考虑以下代码:

//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显示空白/空白。有什么理由吗?我能正确连接吗?

2 个答案:

答案 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());