Каково различие между Строкой и StringBuffer в Java?

Каково различие между Строкой и StringBuffer в Java?

Существует ли максимальный размер для Строки?

63
задан Jonik 27 July 2013 в 02:02
поделиться

5 ответов

String используется для работы со строками символов, которые не могут быть изменены (только для чтения и неизменяемы).

StringBuffer используется для представления символов, которые могут быть изменены.

С точки зрения производительности, StringBuffer быстрее при выполнении конкатенаций. Это происходит потому, что при конкатенации String каждый раз создается новый объект (внутренне), поскольку String является неизменяемым.

Вы также можете использовать StringBuilder, который похож на StringBuffer, только он не синхронизирован. Максимальный размер для любого из них равен Integer.MAX_VALUE (231 - 1 = 2 147 483 647) или максимальный размер кучи, деленный на 2 (см. Сколько символов может иметь строка Java?). Дополнительная информация здесь.

75
ответ дан 24 November 2019 в 16:11
поделиться

A StringBuffer или его младший и более быстрый собрат StringBuilder предпочтительнее, когда вы собираетесь делать много конкатенаций строк в варианте

string += newString;

или, что эквивалентно

string = string + newString;

, потому что вышеуказанные конструкции неявно создают новую строку каждый раз, что будет иметь огромную производительность и падение. Под капотами StringBuffer / StringBuilder лучше всего сравнивать с динамически расширяемым List .

1
ответ дан 24 November 2019 в 16:11
поделиться

Строка - это неизменяемый символьный массив.

A StringBuffer - это изменяемый символьный массив. Часто конвертируется обратно в String после преобразования.

Поскольку оба являются массивом, максимальный размер для обоих равен максимальному размеру целого числа, равному 2 ^ 31-1 (см. JavaDoc , также проверьте JavaDoc для обоих ] String и StringBuffer ). Это связано с тем, что аргумент .length массива является примитивным int . (См. Массивы ).

1
ответ дан 24 November 2019 в 16:11
поделиться

A String является неизменяемой, т.е. когда она создана, она никогда не может измениться.

Буфер StringBuffer (или его несинхронизированный родственник StringBuilder) используется, когда вам нужно построить строку по частям без затрат производительности на создание множества маленьких Stringов по пути.

Максимальная длина для обеих строк - Integer.MAX_VALUE, поскольку они хранятся внутри как массивы, а массивы Java имеют только int для своего псевдополя длины.

Улучшение производительности между Strings и StringBuffers для множественной конкатенации весьма значительно. Если вы выполните следующий тестовый код, вы увидите разницу. На моем древнем ноутбуке с 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");
    }
}
34
ответ дан 24 November 2019 в 16:11
поделиться

StringBuffer используется для создания одной строки из множества строк, например когда вы хотите добавить части строки в цикл.

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

Насколько я знаю, в Java как языке нет верхнего предела для размера строки, но у JVM, вероятно, есть верхний предел.

2
ответ дан 24 November 2019 в 16:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: