Разница между String и StringBuffer в Java

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

Ex:-

String str = "some"; str = str + " text"

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

Ex:- StringBuffer str = new StringBuffer(); str.append("try"); str.append("this");

Мой вопрос здесь в том, чтобы добавить метод, мы снова передаем String. Не создавайте ли новые объекты String для "try" и "this" в пуле строк в приведенном выше случае.


person user3386493    schedule 06.03.2014    source источник


Ответы (4)


Да, новые объекты String создаются для "try" и "this". Преимущество здесь в том, что StringBuffer хранит строку символов внутри как массив с динамически изменяемым размером.

Было бы более очевидным, если бы мы объединили более двух строк:

"try" + "this" + "test"

Это потенциально может создать 5 объектов String, потому что вам нужны промежуточные значения. (Технически конкатенация литералов выполняется во время компиляции, так что это всего лишь концептуальный пример.) Для компилятора также было бы типичным рефакторинг приведенного выше фрагмента в любом случае использовать StringBuilder, если бы они не были литералами.

StringBuilder - это более новая и несинхронизированная версия StringBuffer. В общем, вы должны предпочесть StringBuilder. Разница между этими двумя классами описана в «StringBuilder и StringBuffer в Java».

person Radiodef    schedule 06.03.2014
comment
Из опубликованного ответа stackoverflow.com/questions/47605/ похоже, что оператор + поддерживается StringBuilder. Следовательно, вероятно, исходный вопрос действителен для более старой версии. - person user3386493; 21.02.2017

Основное различие (помимо того, что StringBuffer изменяемый, а String - неизменный) - это производительность. Я нашел хорошее объяснение здесь

Однако я также обнаружил, что StringBuilder предпочтительнее StringBuffer, потому что StringBuffer синхронизирован, а StringBuilder - нет.

person tupini07    schedule 06.03.2014

для некоторых строк мы не видим никакой разницы.

поэтому я думаю, что пример может показать вам, почему вы должны использовать StringBuffer (или StringBuilder, в зависимости от ваших потребностей) вместо конкатенации строк с помощью +

попробуйте это и убедитесь сами

public class UseSB {
    static int x = 100000;
    public static void main(String[] args) {
        long i1 = System.currentTimeMillis();
        main1();
        long i2 = System.currentTimeMillis();
        main2();
        long i3 = System.currentTimeMillis();
        System.out.println(i2-i1);
        System.out.println(i3-i2);
    }

    public static void main1() {
        String s = "x";
        for(int i=0;i<x;i++){
            s = s + Integer.toString(i);
        }
        System.out.println(s.length());
    }

    public static void main2() {
        StringBuffer s = new StringBuffer("x");
        for(int i=0;i<x;i++){
            s.append(Integer.toString(i));
        }
        System.out.println(s.toString().length());
    }

}
person Leo    schedule 06.03.2014

  • Строка: Строка - это immutable (однажды созданный не может быть изменен) объект. Объект, созданный как строка, сохраняется в пуле константных строк. Каждый неизменяемый объект в Java является потокобезопасным, что означает, что String также является потокобезопасным. Строка не может использоваться двумя потоками одновременно. Однажды назначенная строка не может быть изменена.

  • StringBuffer: StringBuffer - это mutable. Это означает, что можно изменить стоимость объекта. Объект, созданный с помощью StringBuffer, хранится в куче. StringBuffer имеет те же методы, что и StringBuilder, но каждый метод в StringBuffer синхронизирован, то есть StringBuffer является потокобезопасным.

    Из-за этого он не позволяет двум потокам одновременно обращаться к одному и тому же методу. К каждому методу можно получить доступ по одному потоку за раз.

    Но потокобезопасность также имеет недостатки, так как производительность StringBuffer попадает из-за свойства потокобезопасности. Таким образом, StringBuilder быстрее, чем StringBuffer, при вызове одних и тех же методов каждого класса.

  • StringBuilder: StringBuilder аналогичен StringBuffer, то есть он хранит объект в куче, и его также можно изменить. Основное различие между StringBuffer и StringBuilder заключается в том, что StringBuilder также не является потокобезопасным. StringBuilder работает быстро, поскольку не является потокобезопасным.

Источник: http://javahungry.blogspot.com/2013/06/difference-between-string-stringbuilder.html

person Pawan J    schedule 20.05.2016