ArrayList
hérite toString()
-method de AbstractCollection
, à savoir:
public String toString() {
Iterator<E> i = iterator();
if (! i.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (! i.hasNext())
return sb.append(']').toString();
sb.append(", ");
}
}
Construire la chaîne vous sera beaucoup plus efficace.
Si vous voulez vraiment regrouper les chaînes au préalable dans une sorte de liste, vous devez fournir votre propre méthode pour les rejoindre efficacement, par exemple comme ceci:
static String join(Collection<?> items, String sep) {
if(items.size() == 0)
return "";
String[] strings = new String[items.size()];
int length = sep.length() * (items.size() - 1);
int idx = 0;
for(Object item : items) {
String str = item.toString();
strings[idx++] = str;
length += str.length();
}
char[] chars = new char[length];
int pos = 0;
for(String str : strings) {
str.getChars(0, str.length(), chars, pos);
pos += str.length();
if(pos < length) {
sep.getChars(0, sep.length(), chars, pos);
pos += sep.length();
}
}
return new String(chars);
}
Je suis d'accord pour dire que je n'aime pas la façon de faire de l'OP, mais pour des raisons différentes. (1) Faire ainsi déguise l'intention du code (alors que quelque chose comme 'StringUtils.join' est parfaitement lisible). (2) Ce n'est pas flexible, puisque vous pourriez vouloir changer le délimiteur. (Remplacer simplement "", "' dans la chaîne finale n'est pas un bon moyen, car il pourrait y avoir '", "' incorporé dans les chaînes d'origine.) Donc même si, comme vous le dites, 'ArrayList.toString' a probablement gagné Je ne changerais pas, je n'irais toujours pas dans cette voie. –
Vous pouvez être sûr à 99,9% que ArrayList.toString ne changera pas à moins de devenir un vecteur d'attaque; la rétrocompatibilité verra à cela. Mais je suis d'accord qu'utiliser toString() est toujours une mauvaise idée. –