div.main {margin-left: 20pt; margin-right: 20pt}
String против StringBuffer
Когда дело касается строковых, используете ли вы String или
StringBuffer для хранения строковых данных, может оказать значительный эффект на
вашу общую производительность. Сегодня мы рассмотрим оба класса - String и
StringBuffer и определим те ситуации, в которых вместо String должен
использоваться StringBuffer.
Объект String просто хранит массив символов и предоставляет методы
для исполнения операций на этом массиве. Объект String - также единственный
объект, который перегружает оператор конкатенации "+". Это позволяет строковым
быть созданными конкатенацией одного или нескольких объектов String.
Например:
String fname = "John";
String lname = "Smith";
String fullname = fname + lname;
Однако строки - неизменные значения, однажды
созданные они не могут изменяться. Всякий раз, когда Вы переназначаете значение
строковой переменной, вы на самом деле создаете другой объект String и сообщаете
JVM, что нужно использовать недавно созданный объект String как (placeholder)
для переменной.
Например:
String fname = "John";
/*
создан новый объект String
Старый объект, ожидающий сборку "мусора"
*/
fname = "Jack";
Рассмотрим случай, когда строковая переменная должна измениться
несколько раз. Каждый раз, когда значение этой строковой переменной изменяется,
должен быть создан новый объект String. Это приведет к созданию нескольких
объектов String в памяти, ожидающим сборку "мусора". Не упоминая даже о
дополнительной нагрузке на ЦП при создании этих новый объектов.
Например:
int i;
String contents = null;
for(i = 0; i < 10; i++)
{
contents += "hello worldn";
}
/* вывод содержимого на экран */
System.out.println(contents);
Вышеупомянутый код создал бы, 10 отдельных объектов
String, 9 из которых постоянно находятся в памяти, ожидая сборку "мусора".
Большую эффективность даст обработка с помощью объекта StringBuffer.
Объект StringBuffer тоже хранит массив символов, но с некоторыми тонкими
различиями.
1. В нем не перегружен метод конкатенации "+". 2. Его
содержимое может быть изменено без создания новых экземпляров объекта
StringBuffer.
Изменение кода, представленного выше, чтобы воспользоваться преимуществом
объекта StringBuffer, требует только нескольких простых изменений.
Пример:
int i;
StringBuffer contents = new StringBuffer();
for(i = 0; i < 10; i++)
{
contents.append("hello worldn");
}
/* вывод содержимого на экран */
System.out.println(contents.toString());
Применяя объект StringBuffer, только один объект используется на
протяжении действия цикла. Повышение производительности может быть неочевидно в
таком малом цикле, как представленный выше. Однако попробуйте проделать это с
объектом String, когда вы предполагаете изменять его сотни раз, и вы начнете
обращать внимание на разницу.
VanGlass 2000. Оригинал тут. Перевод Станислав Песоцкий.
|