String против StringBuilder против StringBuffer в Java

Опубликовано: 15 Февраля, 2022

Prerequisites: String, Initialize a String 
Consider below code with three concatenation functions with three different types of parameters, String, StringBuffer and StringBuilder.

Java

// Java program to demonstrate difference
// between String, StringBuilder and StringBuffer
class Geeksforgeeks {
    // Concatenates to String
    public static void concat1(String s1)
    {
        s1 = s1 + "forgeeks";
    }
 
    // Concatenates to StringBuilder
    public static void concat2(StringBuilder s2)
    {
        s2.append("forgeeks");
    }
 
    // Concatenates to StringBuffer
    public static void concat3(StringBuffer s3)
    {
        s3.append("forgeeks");
    }
 
    public static void main(String[] args)
    {
        String s1 = "Geeks";
 
        // s1 is not changed
        concat1(s1);
        System.out.println("String: " + s1);
 
        StringBuilder s2 = new StringBuilder("Geeks");
 
        // s2 is changed
        concat2(s2);
        System.out.println("StringBuilder: " + s2);
 
        StringBuffer s3 = new StringBuffer("Geeks");
 
        // s3 is changed
        concat3(s3);
        System.out.println("StringBuffer: " + s3);
    }
}
Output
String: Geeks
StringBuilder: Geeksforgeeks
StringBuffer: Geeksforgeeks

Объяснение:

  1. Concat1 : В этом методе мы передаем строку «Компьютерщики» и выполняем «s1 = s1 +» forgeeks ». Строка, переданная из main (), не изменяется, это связано с тем, что String неизменяема . Изменение значения строки создает другой объект, а s1 в concat1 () сохраняет ссылку на новую строку. Ссылки s1 в main () и cocat1 () относятся к разным строкам.
  2. Concat2 : в этом методе мы передаем строку «Geeks» и выполняем «s2.append (« forgeeks »)», который изменяет фактическое значение строки (в основном) на «Geeksforgeeks». Это связано с тем простым фактом, что StringBuilder является изменяемым и, следовательно, меняет свое значение.
  3. Concat3 : StringBuffer похож на StringBuilder, за исключением того, что StringBuffer является потокобезопасным, т. Е. Несколько потоков могут использовать его без каких-либо проблем. Потоковая безопасность снижает производительность.
    Когда какой использовать:
  • Если строка будет оставаться постоянной на протяжении всей программы, используйте объект класса String, потому что объект String неизменяем.
  • Если строка может измениться (например: много логики и операций при построении строки) и будет доступна только из одного потока, использование StringBuilder достаточно хорошо.
  • Если строка может изменяться и к ней можно будет получить доступ из нескольких потоков, используйте StringBuffer, потому что StringBuffer является синхронным, поэтому у вас есть потокобезопасность.
  • Если вам не нужна потокобезопасность, вы также можете использовать класс StringBuilder, поскольку он не синхронизирован.

Преобразование между типами строк в Java

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

1. Из String в StringBuffer и StringBuilder:

This one is easy. We can directly pass the String class object to StringBuffer and StringBuilder class constructors. As the String class is immutable in java, so for editing a string, we can perform the same by converting it to StringBuffer or StringBuilder class objects. Below is the java program to demonstrate the same. 

Java

// Java program to demonstrate conversion from
// String to StringBuffer and StringBuilder.
public class Test {
    public static void main(String[] args)
    {
        String str = "Geeks";
 
        // conversion from String object to StringBuffer
        StringBuffer sbr = new StringBuffer(str);
        sbr.reverse();
        System.out.println(sbr);
 
        // conversion from String object to StringBuilder
        StringBuilder sbl = new StringBuilder(str);
        sbl.append("ForGeeks");
        System.out.println(sbl);
    }
}
Output
skeeG
GeeksForGeeks

2. Из StringBuffer и StringBuilder в String:

This conversion can be performed using toString() method which is overridden in both StringBuffer and StringBuilder classes. 
Below is the java program to demonstrate the same. Note that while we use toString() method, a new String object(in Heap area) is allocated and initialized to the character sequence currently represented by the StringBuffer object, which means the subsequent changes to the StringBuffer object do not affect the contents of the String object. 

Java

// Java program to demonstrate conversion from
// String to StringBuffer and StringBuilder.
public class Test {
    public static void main(String[] args)
    {
        StringBuffer sbr = new StringBuffer("Geeks");
        StringBuilder sbdr = new StringBuilder("Hello");
 
        // conversion from StringBuffer object to String
        String str = sbr.toString();
        System.out.println(
            "StringBuffer object to String : ");
        System.out.println(str);
 
        // conversion from StringBuilder object to String
        String str1 = sbdr.toString();
        System.out.println(
            "StringBuilder object to String : ");
        System.out.println(str1);
 
        // changing StringBuffer object sbr
        // but String object(str) doesn"t change
        sbr.append("ForGeeks");
        System.out.println(sbr);
        System.out.println(str);
    }
}
Output
StringBuffer object to String : 
Geeks
StringBuilder object to String : 
Hello
GeeksForGeeks
Geeks

3. Из StringBuffer в StringBuilder или наоборот:

Это преобразование сложно. Нет прямого способа преобразовать то же самое. В этом случае мы можем использовать объект класса String. Сначала мы преобразуем объект StringBuffer / StringBuilder в String, используя метод toString (), а затем из String в StringBuilder / StringBuffer, используя конструкторы.

Below is the java program to demonstrate the same.

Java

// Java program to demonstrate conversion from
// String to StringBuffer and StringBuilder.
public class Test {
    public static void main(String[] args)
    {
        StringBuffer sbr = new StringBuffer("Geeks");
 
        // conversion from StringBuffer
        // object to StringBuilder
        String str = sbr.toString();
        StringBuilder sbl = new StringBuilder(str);
 
        System.out.println(sbl);
    }
}
Output
Geeks

Заключение:

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

Связанная статья:
Перевернуть строку в Java (5 разных способов)

Эта статья предоставлена Пранджалом и Гауравом Миглани . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью и отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

Вниманию читателя! Не переставай учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по доступной для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .