Разница между StringBuilder и StringBuffer - PullRequest
1462 голосов
/ 10 декабря 2008

В чем основная разница между StringBuffer и StringBuilder? Есть ли проблемы с производительностью при выборе любого из них?

Ответы [ 30 ]

21 голосов
/ 10 декабря 2008

StringBuffer

  • Синхронизированный, следовательно, потокобезопасный
  • Поток безопасен, следовательно, медленен

StringBuilder

  • Представлено в Java 5.0
  • Асинхронный, следовательно, быстрый и эффективный
  • Пользователь явно должен синхронизировать его, если он хочет
  • Вы можете заменить его на StringBuffer без каких-либо других изменений
18 голосов
/ 20 сентября 2016

StringBuffer

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

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

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

Значение StringBuffer может быть изменено, это означает, что оно может быть присвоено новому значению. В настоящее время это самый распространенный вопрос интервью, различия между вышеуказанными классами. Строковый буфер может быть преобразован в строку с помощью Метод toString ().

StringBuffer demo1 = new StringBuffer(“Hello”) ;
// The above object stored in heap and its value can be changed .

demo1=new StringBuffer(“Bye”);
// Above statement is right as it modifies the value which is allowed in the StringBuffer

StringBuilder

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

StringBuilder demo2= new StringBuilder(“Hello”);
// The above object too is stored in the heap and its value can be modified

demo2=new StringBuilder(“Bye”);
// Above statement is right as it modifies the value which is allowed in the StringBuilder

enter image description here

Ресурс: String Vs StringBuffer Vs StringBuilder

16 голосов
/ 18 марта 2013

String является неизменным.

StringBuffer является изменяемым и синхронизированным.

StringBuilder также изменчив, но не синхронизирован.

11 голосов
/ 25 января 2011

javadoc объясняет разницу:

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

10 голосов
/ 25 января 2011

StringBuilder (введено в Java 5) идентично StringBuffer, за исключением того, что его методы не синхронизированы. Это означает, что он имеет лучшую производительность, чем последний, но недостатком является то, что он не является потокобезопасным.

Прочитайте учебник для более подробной информации.

6 голосов
/ 14 марта 2014

Простая программа, иллюстрирующая разницу между StringBuffer и StringBuilder:

/**
 * Run this program a couple of times. We see that the StringBuilder does not
 * give us reliable results because its methods are not thread-safe as compared
 * to StringBuffer.
 * 
 * For example, the single append in StringBuffer is thread-safe, i.e.
 * only one thread can call append() at any time and would finish writing
 * back to memory one at a time. In contrast, the append() in the StringBuilder 
 * class can be called concurrently by many threads, so the final size of the 
 * StringBuilder is sometimes less than expected.
 * 
 */
public class StringBufferVSStringBuilder {

    public static void main(String[] args) throws InterruptedException {

        int n = 10; 

        //*************************String Builder Test*******************************//
        StringBuilder sb = new StringBuilder();
        StringBuilderTest[] builderThreads = new StringBuilderTest[n];
        for (int i = 0; i < n; i++) {
            builderThreads[i] = new StringBuilderTest(sb);
        }
        for (int i = 0; i < n; i++) {
            builderThreads[i].start();
        }
        for (int i = 0; i < n; i++) {
            builderThreads[i].join();
        }
        System.out.println("StringBuilderTest: Expected result is 1000; got " + sb.length());

        //*************************String Buffer Test*******************************//

        StringBuffer sb2 = new StringBuffer();
        StringBufferTest[] bufferThreads = new StringBufferTest[n];
        for (int i = 0; i < n; i++) {
            bufferThreads[i] = new StringBufferTest(sb2);
        }
        for (int i = 0; i < n; i++) {
            bufferThreads[i].start();
        }
        for (int i = 0; i < n; i++) {
            bufferThreads[i].join();
        }
        System.out.println("StringBufferTest: Expected result is 1000; got " + sb2.length());

    }

}

// Every run would attempt to append 100 "A"s to the StringBuilder.
class StringBuilderTest extends Thread {

    StringBuilder sb;

    public StringBuilderTest (StringBuilder sb) {
        this.sb = sb;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            sb.append("A");
        }

    }
}


//Every run would attempt to append 100 "A"s to the StringBuffer.
class StringBufferTest extends Thread {

    StringBuffer sb2;

    public StringBufferTest (StringBuffer sb2) {
        this.sb2 = sb2;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            sb2.append("A");
        }

    }
}
4 голосов
/ 25 января 2011

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

4 голосов
/ 23 декабря 2009

StringBuffer синхронизирован, но StringBuilder нет. В результате StringBuilder быстрее, чем StringBuffer.

4 голосов
/ 01 февраля 2017

String-Builder :

int one = 1;
String color = "red";
StringBuilder sb = new StringBuilder();
sb.append("One=").append(one).append(", Color=").append(color).append('\n');
System.out.print(sb);
// Prints "One=1, Colour=red" followed by an ASCII newline.

Строка-Buffer

StringBuffer sBuffer = new StringBuffer("test");
sBuffer.append(" String Buffer");
System.out.println(sBuffer);  

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

4 голосов
/ 27 сентября 2015

StringBuffer:

  • Multi-Thread
  • Синхронное
  • Медленнее, чем StringBuilder

StringBuilder

  • Однозаходные
  • Не-Синхронное
  • Быстрее, чем когда-либо String
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...