String vs StringBuilder vs StringBuffer in Java
Last Updated :
27 May, 2025
A string is a sequence of characters. In Java, String objects are immutable, which simply means once created, their values can not be changed. In Java, String, StringBuilder, and StringBuffer are used for handling strings. The main difference is:
- String: Immutable, meaning its value cannot be changed once created. It is thread-safe but less memory-efficient.
- StringBuilder: Mutable, not thread-safe, and more memory-efficient compared to String. Best used for single-threaded operations.
- StringBuffer: Mutable and thread-safe due to synchronization, but less efficient than StringBuilder in terms of performance.
Difference Between String, StringBuilder, and StringBuffer
Features | String | StringBuilder | StringBuffer |
---|
Introduction | Introduced in JDK 1.0 | Introduced in JDK 1.5 | Introduced in JDK 1.0 |
---|
Mutability | Immutable | Mutable | Mutable |
---|
Thread Safety | Thread Safe | Not Thread Safe | Thread Safe |
---|
Memory Efficiency | High | Efficient | Less Efficient |
---|
Performance | Can be slower for many concatenations | High(No-Synchronization) | Low(Due to Synchronization) |
---|
Usage | This is used when we want immutability. | This is used when Thread safety is not required. | This is used when Thread safety is required. |
---|
Let us consider the code below with three concatenation functions with three different types of parameters, String, StringBuffer, and StringBuilder. Let us clear out the understanding between them via a single Java program below, from which we will be drawing out conclusions from the output generated, to figure out the main differences between String vs StringBuilder, vs StringBuffer in Java.
Example:
Java
// Java program to demonstrate difference between
// String, StringBuilder and StringBuffer
class Geeks {
// Method 1
// Concatenates to String
public static void concat1(String s1)
{
s1 = s1 + "forgeeks";
}
// Method 2
// Concatenates to StringBuilder
public static void concat2(StringBuilder s2)
{
s2.append("forgeeks");
}
// Method 3
// Concatenates to StringBuffer
public static void concat3(StringBuffer s3)
{
s3.append("forgeeks");
}
// Method 4
// Main driver method
public static void main(String[] args)
{
// Custom input string
// String 1
String s1 = "Geeks";
// Calling above defined method
concat1(s1);
// s1 is not changed
System.out.println("String: " + s1);
// String 1
StringBuilder s2 = new StringBuilder("Geeks");
// Calling above defined method
concat2(s2);
// s2 is changed
System.out.println("StringBuilder: " + s2);
// String 3
StringBuffer s3 = new StringBuffer("Geeks");
// Calling above defined method
concat3(s3);
// s3 is changed
System.out.println("StringBuffer: " + s3);
}
}
OutputString: Geeks
StringBuilder: Geeksforgeeks
StringBuffer: Geeksforgeeks
Explanation:
- Concat1: In this method, the string "Geeks" is passed, and we perform s1 = s1 + "forgeeks". Since String is immutable, a new string is created, and s1 in concat1() points to it. The original string in main() remains unchanged.
- Concat2: Here, s2.append("forgeeks") modifies the original StringBuilder object. Since StringBuilder is mutable, it updates the string directly in main() to "Geeksforgeeks".
- Concat3: StringBuffer and StringBuilder are similar, but StringBuffer is thread-safe due to synchronized methods, while StringBuilder is not, making it thread-unsafe.
When to Use Which?
Geeks now you must be wondering when to use which one, do refer below as follows:
- If a string is going to remain constant throughout the program, then use the String class object because a String object is immutable.
- If a string can change (for example: lots of logic and operations in the construction of the string) and will only be accessed from a single thread, using a StringBuilder is good enough.
- If a string can change and will be accessed from multiple threads, use a StringBuffer because StringBuffer is synchronous, so you have thread-safety.
- If you don't want thread-safety than you can also go with StringBuilder class as it is not synchronized.
Conversion Between String, StringBuilder, and StringBuffer
Sometimes there is a need for converting a string object of different classes like String, StringBuffer, StringBuilder to one another. Below are some techniques to do the same. Let's cover all use cases as follows:
- From String to StringBuffer and StringBuilder
- From StringBuffer and StringBuilder to String
- From StringBuffer to StringBuilder or vice-versa
Case 1: Convert String to StringBuffer and StringBuilder
This one is an easy way out as 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.
Example:
Java
// Java program to demonstrate conversion from
// String to StringBuffer and StringBuilder
public class Geeks {
public static void main(String[] args) {
// Custom input string
String s = "Geeks";
// Converting String object to StringBuffer object
// by creating object of StringBuffer class
StringBuffer sbr = new StringBuffer(s);
// Reversing the string
sbr.reverse();
// Printing the reversed string
System.out.println(sbr);
// Converting String object to StringBuilder object
StringBuilder sbl = new StringBuilder(s);
// Adding it to string using append() method
sbl.append("forGeeks");
// Print and display the above appended string
System.out.println(sbl);
}
}
OutputskeeG
GeeksforGeeks
Explanation: The above example shows how to convert a String into StringBuffer and StringBuilder. We are reversing the String using StringBuffer and then adds more text using StringBuilder.
Case 2: Convert StringBuffer or StringBuilder to 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: 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.
Example:
Java
// Java Program to Demonstrate Conversion from
// String to StringBuffer and StringBuilder
public class Geeks {
public static void main(String[] args) {
// Creating objects of
// StringBuffer class
StringBuffer sbr = new StringBuffer("Geeks");
StringBuilder sbl = new StringBuilder("Hello");
// Converting StringBuffer object to String
// using toString() method
String s1 = sbr.toString();
// Printing the above string
System.out.println(
"StringBuffer object to String: ");
System.out.println(s1);
// Converting StringBuilder object to String
String s2 = sbl.toString();
// Printing the above string
System.out.println(
"StringBuilder object to String: ");
System.out.println(s2);
// Changing StringBuffer object sbr
// but String object(s1) doesn't change
sbr.append("ForGeeks");
// Printing the above two strings on console
System.out.println(sbr);
System.out.println(s1);
}
}
OutputStringBuffer object to String:
Geeks
StringBuilder object to String:
Hello
GeeksForGeeks
Geeks
Explanation: The above example shows how to convert StringBuffer and StringBuilder objects into String with the help of toString() method.
Case 3: Convert StringBuffer to StringBuilder or vice-versa
This conversion is tricky. There is no direct way to convert the same. In this case, We can use a String class object. We first convert the StringBuffer/StringBuilder object to String using toString() method and then from String to StringBuilder/StringBuffer using constructors.
Example:
Java
// Java program to Demonstrate conversion from
// String to StringBuffer and StringBuilder
public class Geeks {
// Main driver method
public static void main(String[] args) {
// Creating object of StringBuffer class and
// passing our input string to it
StringBuffer sbr = new StringBuffer("Geek");
// Storing value StringBuffer object in String and
// henceforth converting StringBuffer object to
// StringBuilder class
String s = sbr.toString();
StringBuilder sbl = new StringBuilder(s);
System.out.println(sbl);
}
}
Explanation: The above example shows how to convert a StringBuffer into a String and then converting the same String into a StringBuilder.
Note: From the above three use-cases we can conclude out below pointers:
- Objects of String are immutable, and objects of StringBuffer and StringBuilder are mutable.
- StringBuffer and StringBuilder are similar, but StringBuilder is faster and preferred over StringBuffer for the single-threaded program. If thread safety is needed, then StringBuffer is used.
Similar Reads
Java Tutorial Java is a high-level, object-oriented programming language used to build web apps, mobile applications, and enterprise software systems. It is known for its Write Once, Run Anywhere capability, which means code written in Java can run on any device that supports the Java Virtual Machine (JVM).Java s
10 min read
Java OOP(Object Oriented Programming) Concepts Java Object-Oriented Programming (OOPs) is a fundamental concept in Java that every developer must understand. It allows developers to structure code using classes and objects, making it more modular, reusable, and scalable.The core idea of OOPs is to bind data and the functions that operate on it,
13 min read
Java Interview Questions and Answers Java is one of the most popular programming languages in the world, known for its versatility, portability, and wide range of applications. Java is the most used language in top companies such as Uber, Airbnb, Google, Netflix, Instagram, Spotify, Amazon, and many more because of its features and per
15+ min read
Arrays in Java Arrays in Java are one of the most fundamental data structures that allow us to store multiple values of the same type in a single variable. They are useful for storing and managing collections of data. Arrays in Java are objects, which makes them work differently from arrays in C/C++ in terms of me
15+ min read
Collections in Java Any group of individual objects that are represented as a single unit is known as a Java Collection of Objects. In Java, a separate framework named the "Collection Framework" has been defined in JDK 1.2 which holds all the Java Collection Classes and Interface in it. In Java, the Collection interfac
15+ min read
Inheritance in Java Java Inheritance is a fundamental concept in OOP(Object-Oriented Programming). It is the mechanism in Java by which one class is allowed to inherit the features(fields and methods) of another class. In Java, Inheritance means creating new classes based on existing ones. A class that inherits from an
13 min read
Java Exception Handling Exception handling in Java allows developers to manage runtime errors effectively by using mechanisms like try-catch block, finally block, throwing Exceptions, Custom Exception handling, etc. An Exception is an unwanted or unexpected event that occurs during the execution of a program, i.e., at runt
10 min read
Java Programs - Java Programming Examples In this article, we will learn and prepare for Interviews using Java Programming Examples. From basic Java programs like the Fibonacci series, Prime numbers, Factorial numbers, and Palindrome numbers to advanced Java programs.Java is one of the most popular programming languages today because of its
8 min read
Java Interface An Interface in Java programming language is defined as an abstract type used to specify the behaviour of a class. An interface in Java is a blueprint of a behaviour. A Java interface contains static constants and abstract methods. Key Properties of Interface:The interface in Java is a mechanism to
12 min read
Introduction to Java Java is a high-level, object-oriented programming language developed by Sun Microsystems in 1995. It is platform-independent, which means we can write code once and run it anywhere using the Java Virtual Machine (JVM). Java is mostly used for building desktop applications, web applications, Android
4 min read