String vs StringBuilder vs StringBuffer

date
Sep 22, 2024
slug
string-stringbuilder-stringbuffer
status
Published
tags
Java
Concept
String
summary
type
Post
Java provides three classes to represent a sequence of characters: String, StringBuffer, and StringBuilder.
String is one of the most widely used classes in Java. StringBuffer and StringBuilder classes provide methods to manipulate strings.

String

String is immutable in Java. So it’s suitable to use in a multi-threaded environment. We can share it across functions because there is no concern of data inconsistency.
 
We can instantiate String in two ways:
When we create a String using double quotes, JVM first looks for the String with the same value in the string pool. If found, it returns the reference of the string object from the pool. Otherwise, it creates the String object in the String pool and returns the reference. JVM saves a lot of memory by using the same String in different threads.
If the new operator is used to create a string, it gets created in the heap memory.
 
String concatenation operator (+) internally uses StringBuffer or StringBuilder class.

String vs StringBuffer

Since String is immutable in Java, whenever we do String manipulation like concatenation, substring, etc. it generates a new String and discards the older String for garbage collection. These are heavy operations and generate a lot of garbage in heap.
So Java has provided StringBuffer and StringBuilder classes that should be used for String manipulation. StringBuffer and StringBuilder are mutable objects in Java.

StringBuffer vs StringBuilder

StringBuffer was introduced in Java 1.0 whereas StringBuilder class was introduced in Java 1.5 after looking at shortcomings of StringBuffer.
StringBuffer provides Thread safety (all of its public methods are synchronized) but at a performance cost. In most of the scenarios, we don’t use String in a multithreaded environment. So Java 1.5 introduced a new class StringBuilder, which is similar to StringBuffer except for thread-safety and synchronization.
StringBuilder performs better than StringBuffer, and is better suited in most of the general programming scenarios. If you are in a single-threaded environment or don’t care about thread safety, you should use StringBuilder. Otherwise, use StringBuffer for thread-safe operations.
StringBuffer has some extra methods such as substring, length, capacity, trimToSize, etc. However, these are not required since you have all these present in String too. That’s why these methods were never implemented in the StringBuilder class.
 
StringBuffer
StringBuilder
Synchronized i.e. thread safe. It means two threads can't call the methods of StringBuffer simultaneously.
Non-synchronized i.e. not thread safe. It means two threads can call the methods of StringBuilder simultaneously.
Suitable for multi-threaded environments
Suitable for single-threaded environments
Slightly less efficient due to thread-safety
More efficient
Slightly more memory allocation overhead
Less memory allocation overhead
StringBuffer was introduced in Java 1.0
StringBuilder was introduced in Java 1.5
Mutable
Mutable
Recommended in concurrent scenarios, thread-safe environments
Recommended in non-concurrent scenarios, performance-critical operations

References


© Foy Wan 2022 - 2025