stringConcat

При просмотре статистики по запросам на мой сайт, нашёл запрос о коонкатенации строк в Java. И решил написать по этому поводу небольшую заметку.

Итак, слово ‘конкатенация’ означает процесс склеивания объектов линейной структуры. Проще говоря, если вы из двух объектов делаете один новый, то это конкатенация. И простейщий способ совершить конкатенацию строк в джава – сложить их:

 String newString  = string1+ string2;

Но! Такой способ считается  не кошерным, а главное, он не единственный. Для этих целей, можно использовать такие объекты как StringBuilder, StringBuffer, а так же метод String.format(…).

Первые два используются следующим образом:

String newString = new StringBuilder().append(string1).append(string2).toString();
newString = new StringBuffer().append(string1).append(string2).toString();

Последний некоторое время пользовался у меня уважением, про его более подробное использование можно почитать [в официальной доке]. Самый простой способ конкатенировать с его помощью строки выглядит так:

String newString = String.format(%s%s”,strin1,string2);

Почему первый способ считается не кошерным? Потому что при конкатенации каждый раз создается новый объект, а зачем нам лишние объекты? Ну а теперь давайте разберемся, какой из методов лучше для конкатенации. Для этого я написал вот такой тест:

И вот давольно интересные результаты:

  1. Simple concatenate.
  2. Average time=812
  3. Max time=23244
  4. Min time=5
  5. ===================================
  6. StringBuilder concatenate.
  7. Average time=326
  8. Max time=1208
  9. Min time=301
  10. ===================================
  11. StringBuffer concatenate.
  12. Average time=694
  13. Max time=11169
  14. Min time=301
  15. ===================================
  16. String format concatenate.
  17. Average time=188488
  18. Max time=14388411
  19. Min time=24149

Судя по результатам тестов, самым быстрым оказывается метод с использованием StringBuilder, а самый плохой — до этого дня мною любимый String.format(…). Почему именно так? Всё просто:

  • StringBuilder лишен проблем простой конкатенации, поэтому он быстрее.
  • Основное различие между StringBuilder и StringBuffer – это потокобезопасность. Последний потокобезопасен, поэтому медленее. Однако, сравним по скорости с простой конкатенацией.
  • Ужасные результаты String.format(…) вполне себе ожидаемы. Он разрабатывался для форматирования текста, поэтому, прежде чем сделать строку, происходит сложный процесс валидации шаблона и форматирования данных согласно ему. Поэтому он самый медленный.

Вывод тут может быть только один. Юзайте почаще StringBuilder, особенно в циклах. Не прогадаете.

Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс