2010-04-16 71 views
2

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

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

回答

1

String对象是不可变的。在toList上调用concat将不会更改toList对象的值。相反,concat将返回一个不同的String对象,该对象是两个字符串的串联。对于您的示例,您需要将每个调用的结果存储在toList变量中,并将其存储为concat

例如,

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()); 
3

字符串是不可改变。这意味着toList.concat(..)不会更改toList。相反,它返回一个新的字符串:

toList = toList.concat(..); 

然而,更建议使用StringBuilder.append(..)

StringBuilder toList = new StringBuilder(); 
for (...) { 
    sb.append(emails[i]); 
    sb.append("; "); 
} 
... 
return sb.toString(); 

一个更好的(在代码重用方面)的方法是使用一个实用程序,用于contatenating串与分隔符。像ArrayUtils.join(emailsArray, "; ");(来自commons-lang)