We use the StringBuffer and StringBuilder classes when we work with mutable String objects since the String class is immutable.
Differences between the StringBuffer and StringBuilder classes are:
| StringBuffer | StringBuilder | |
|---|---|---|
| StringBuffer is synchronized i.e. thread-safe. It means two threads can’t call the methods of StringBuffer simultaneously. | StringBuilder is non-synchronized i.e. not thread-safe. It means two threads can call the methods of StringBuilder simultaneously. | |
| StringBuffer is less efficient than StringBuilder. | StringBuilder is more efficient than StringBuffer. | 
StringBuffer vs StringBuilder Performance Testing
See in the following example the differences in performance between these two classes:
class Test {
  public static void main(String[] args) {
    long startTime = System.currentTimeMillis();
    StringBuffer stringBuffer = new StringBuffer("Java");
    for (int i = 0; i < 8000000; i++) {
      stringBuffer.append("Programming");
    }
    System.out.println("Time taken by StringBuffer: " + (System.currentTimeMillis() - startTime) + "ms");
    startTime = System.currentTimeMillis();
    StringBuilder stringBuilder = new StringBuilder("Java");
    for (int i = 0; i < 8000000; i++) {
      stringBuilder.append("Programming");
    }
    System.out.println("Time taken by StringBuilder: " + (System.currentTimeMillis() - startTime) + "ms");
  }
}
Output: Time taken by StringBuffer: 324ms Time taken by StringBuilder: 208ms
The program output shows that the StringBuffer class took longer to complete the given task.
Conclusion:
If we need to work with a mutable String, and we don’t care if it’s not thread-safe, then we should choose StringBuilder.
That was all regarding StringBuffer vs StringBuilder. Proceed to the next lesson.
Happy Learning!