2010-04-16 5 views
2

J'ai un code pour concaténer les chaînes. Toutefois, pour une raison quelconque, la chaîne finale n'est pas une combinaison des chaînes requises. Considérez le code suivant:Aide au débogage du code de concaténation de chaînes

//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); 

La première instruction sout affiche les chaînes dans cusEmail [i] correctement. Cependant, une fois concaténé, le second sout affiche un vide/vide. Une raison pour cela? Est-ce que je concatène correctement?

Répondre

1

String objets sont immuables. L'appel concat sur toList ne modifiera pas la valeur de l'objet toList. Au lieu de cela, concat renvoie un objet String différent qui est une concaténation des deux chaînes. Pour votre exemple, vous souhaiterez stocker le résultat de chacun des appels à concat dans la variable toList.

Par exemple,

toList = toList.concat(cusEmail[i]); 

Une alternative à l'utilisation de la méthode concat serait d'utiliser l'opérateur de concaténation. Cela pourrait être un peu plus agréable à lire.

toList = toList + cusEmail[i]; 

Notez, cependant, que chaque fois qu'une chaîne est concaténé sur une autre chaîne, un nouvel objet String doit être créé qui contient des copies des informations dans les deux chaînes originales. Cela peut être une manière coûteuse de construire une chaîne quand elle est faite encore et encore dans une boucle telle que ce que vous avez. Cela est vrai que vous utilisiez la méthode concat ou l'opérateur de concaténation. Une alternative consiste à utiliser un objet StringBuilder pour créer votre chaîne.

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

chaîne est immuable . Cela signifie que toList.concat(..) ne change pas toList. Au contraire, elle renvoie une nouvelle chaîne:

toList = toList.concat(..); 

Cependant, il est plus judicieux d'utiliser StringBuilder.append(..):

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

encore mieux (en termes de réutilisation de code) est d'utiliser un utilitaire pour les chaînes contatenating avec des délimiteurs. Comme ArrayUtils.join(emailsArray, "; "); (à partir de commons-lang)