#java
String str=""; for (int i = 0; i < count; i++) { str+="я"; } это правда, что вот этот код превращается компилятором в этот: StringBuilder sb = new StringBuilder(); for (int j = 0; j < i; j++) { sb.append("я"); } Если это так, есть ли смысл использовать второй вариант? Ведь первый более читаем.
Ответы
Ответ 1
Почитайте тут. //медленно String[] fields = new String[] {"a","b","c","d","e","f","g"}; String s = ""; for (int i = 0; i < fields.length; i++) { s = s + fields[i]; } return s; //быстро String[] fields = new String[] {"a","b","c","d","e","f","g"}; StringBuilder s = new StringBuilder(); for (int i = 0; i < fields.length; i++) { s.append(fields[i]); } return s.toString(); Никогда не используйте операции конкатенации (оператор +) строки в цикле, особенно если таких операций у вас много, это может очень существенно снизить производительность. Все это происходит потому, что в приведенном выше примере «s = s + fileds[i]» выполняется целых 3 операции: создается StringBuilder на основе строки s, вызывается метод конкатенации append, после конкатенации вызывается метод toString (выглядит так: s = new StringBuilder(s).append(fields[i]).toString();). Целых 3 операции вместо одной! Помимо этого каждый результат s + fileds[i] будет занимать память в куче, как отдельная строка. Так что ответ на ваш вопрос такой: да, есть смысл использовать StringBuilder вместо конкатенации.Ответ 2
В первом варианте, цикл создаст count строк, которые возможно, будут удалены сборщиком мусора, что не есть хорошо.Второй случай гораздо лучше, так как не создает новый объект, как это делает String, а добавляет нужные символы в существующую строку, что экономит память и предотвращает возможность удаления сборщиком мусора.Настоятельно рекомендую использовать его.Но стоит помнить что этот класс не синхронизирован, поэтому не стоит использовать его в мультипоточных приложениях, а заменять его классом StringBuffer, который практически идентичен StringBuilder'у, только немного медленнее.
Комментариев нет:
Отправить комментарий