Каково различие между Строкой и StringBuffer в Java?
Существует ли максимальный размер для Строки?
String
используется для работы со строками символов, которые не могут быть изменены (только для чтения и неизменяемы).
StringBuffer
используется для представления символов, которые могут быть изменены.
С точки зрения производительности, StringBuffer
быстрее при выполнении конкатенаций. Это происходит потому, что при конкатенации String
каждый раз создается новый объект (внутренне), поскольку String
является неизменяемым.
Вы также можете использовать StringBuilder
, который похож на StringBuffer
, только он не синхронизирован. Максимальный размер для любого из них равен Integer.MAX_VALUE
(231 - 1 = 2 147 483 647) или максимальный размер кучи, деленный на 2 (см. Сколько символов может иметь строка Java?).
Дополнительная информация здесь.
A StringBuffer
или его младший и более быстрый собрат StringBuilder
предпочтительнее, когда вы собираетесь делать много конкатенаций строк в варианте
string += newString;
или, что эквивалентно
string = string + newString;
, потому что вышеуказанные конструкции неявно создают новую строку каждый раз, что будет иметь огромную производительность и падение. Под капотами StringBuffer
/ StringBuilder
лучше всего сравнивать с динамически расширяемым List
.
Строка
- это неизменяемый символьный массив.
A StringBuffer
- это изменяемый символьный массив. Часто конвертируется обратно в String
после преобразования.
Поскольку оба являются массивом, максимальный размер для обоих равен максимальному размеру целого числа, равному 2 ^ 31-1 (см. JavaDoc , также проверьте JavaDoc для обоих ] String
и StringBuffer
). Это связано с тем, что аргумент .length
массива является примитивным int
. (См. Массивы ).
A String
является неизменяемой, т.е. когда она создана, она никогда не может измениться.
Буфер StringBuffer
(или его несинхронизированный родственник StringBuilder
) используется, когда вам нужно построить строку по частям без затрат производительности на создание множества маленьких String
ов по пути.
Максимальная длина для обеих строк - Integer.MAX_VALUE, поскольку они хранятся внутри как массивы, а массивы Java имеют только int
для своего псевдополя длины.
Улучшение производительности между String
s и StringBuffer
s для множественной конкатенации весьма значительно. Если вы выполните следующий тестовый код, вы увидите разницу. На моем древнем ноутбуке с Java 6 я получаю такие результаты:
Concat with String took: 1781ms Concat with StringBuffer took: 0ms
public class Concat
{
public static String concatWithString()
{
String t = "Cat";
for (int i=0; i<10000; i++)
{
t = t + "Dog";
}
return t;
}
public static String concatWithStringBuffer()
{
StringBuffer sb = new StringBuffer("Cat");
for (int i=0; i<10000; i++)
{
sb.append("Dog");
}
return sb.toString();
}
public static void main(String[] args)
{
long start = System.currentTimeMillis();
concatWithString();
System.out.println("Concat with String took: " + (System.currentTimeMillis() - start) + "ms");
start = System.currentTimeMillis();
concatWithStringBuffer();
System.out.println("Concat with StringBuffer took: " + (System.currentTimeMillis() - start) + "ms");
}
}
StringBuffer используется для создания одной строки из множества строк, например когда вы хотите добавить части строки в цикл.
Вы должны использовать StringBuilder вместо StringBuffer, когда у вас есть только один поток, обращающийся к StringBuffer, поскольку StringBuilder не синхронизируется и, следовательно, быстрее.
Насколько я знаю, в Java как языке нет верхнего предела для размера строки, но у JVM, вероятно, есть верхний предел.