Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Effective Java TM.doc
Скачиваний:
3
Добавлен:
28.09.2019
Размер:
2.11 Mб
Скачать

Не используйте строку там, где более уместен иной тип

Тип String создавался для того, чтобы представлять текст, и делает он это прекрасно. Поскольку строки широко распространены и имеют хорошую поддержку в языке Java, возникает естественное желание использовать строки для решения тех задач, для которых они не предназначались. В этой статье обсуждается несколько операций, которые не следует проделывать со строками.

Строки - плохая замена другим типам значений. Когда данные попадают в программу из файла, сети или с клавиатуры, они часто имеют вид строки. Естест­венным является стремление оставить их в том же виде, однако это оправданно лишь тогда, когда данные по своей сути являются текстом. Если получены числовые данные,

141

При конкатенации строк опасайтесь потери производительности

Оператор конкатенации строк (+) - удобный способ объединения нескольких строк в одну. Он превосходно справляется с генерацией отдельной строки для вывода и с созданием строкового представления для небольшого объекта с фиксированным размером, но не допускает масштабирования. Время, которое необходимо оператору конкатенации для последовательного объединения n строк, пропорционально квадрату числа n. К сожалению, это следствие того факта, что строки являются неиз­меняемыми (статья 13). При объединении двух строк копируется содержимое обеих строк.

Например, рассмотрим метод, который создает строковое представление для вы­писываемого счета, последовательно объединяя строки для каждого пункта в счете:

// Неуместное объединение строк - плохая производительность

public String statement() {

String s = “ ” ;

for (int i = 0; i < numItems(); i++)

s += lineForItem(i); // Объединение строк

return s;

Если количество пунктов велико, этот метод работает очень медленно. Чтобы добиться приемлемой производительности, создаваемое представление счета должно храниться в классе StringBuffer, а не String:

public String statement() {

StringBuffer s = new StringBuffer(numItems() * LINE_WIDTH);

for (int i = 0; i < numItems(); i++)

s.append(lineForItem(i));

return s.toString();

Изменение производительности впечатляет. Если число пунктов (nиmItems) рав­но 100, а длина строки (lineForItem) постоянна.и равна 80, то на моей машине второй метод работает в девяносто раз быстрее первого. Поскольку первый метод демонст­рирует квадратичную зависимость от количества пунктов, а второй - линейную, разница в производительности при большем количестве пунктов становится еще более разительной. Заметим, что второй метод начинается с предварительного размещения в памяти объекта StringBuffer, достаточно крупного, чтобы в нем поместился резуль­тат вычислений. Даже если отказаться от этого и создать StringBuffer, имеющий раз­мер по умолчанию, он будет работать в сорок пять раз быстрее, чем первый метод.

144

Мораль проста: не пользуйтесь оператором конкатенации для объединения боль­шого Числа строк, если производительность имеет важное значение. Лучше применять метод append из Класса Str1ngBuffer. В качестве альтернативы можно использовать массив символов или обрабатывать строки по одной, не объединяя их.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]