Позвольте мне сказать, что причина медленной конкатенации строк в том, что строки неизменяемы. Это означает, что каждый раз, когда вы пишете «+ =», создается новая строка. Это означает, что способ построения вашей строки в худшем случае, O (n 2 ). Это потому, что если вы + = 'ed 1 char за раз, стоимость построения новой строки будет 2 + 3 + 4 + ... + n, что равно O (n 2 ).
Используйте StringBuilder как совет для других (более медленный, но поточно-безопасный StringBuffer).
Полагаю, мне следует добавить, что StringBuilder даст вам амортизированное время O (n), потому что оно работает как закулисный вектор, поскольку оно изменчиво. Поэтому создайте свою строку там, а затем вызовите toString ().
StringBuilder builder = new StringBuilder();
builder.append("blah"); // append more as needed.
String text = builder.toString();
Я также хотел бы добавить, что эта проблема похожа на Python. В Python идиома состоит в том, чтобы добавить все ваши строки для объединения в список, а затем присоединиться к списку. "".join(the_list)
.
ОБНОВЛЕНИЕ: Как указывает Билл, конкатенация не является корнем всего зла. Одна конкатенация строк хорошо, и даже может быть оптимизирована! (Они также линейные в худшем случае). Но когда вы выполняете конкатенацию в цикле, как и выше, производительность резко меняется с увеличением количества итераций. В этом случае мой анализ выше безупречен, так как я специально заявил, что это «худший случай», что означает, что вы не предполагаете оптимизацию. (Что JVM не может даже оптимизировать конкатенацию в циклах так же хорошо, как вне).