StringBuilder and StringBuffer in Java - Time & Space Complexity
We want to understand how fast StringBuilder and StringBuffer work when building strings.
How does the time to add characters grow as the string gets longer?
Analyze the time complexity of the following code snippet.
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
sb.append('a');
}
String result = sb.toString();
This code builds a string by adding the letter 'a' n times using StringBuilder.
- Primary operation: The loop runs n times, each time appending one character.
- How many times: Exactly n times, once per loop iteration.
Each append adds one character, so the work grows as the string grows.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 appends |
| 100 | About 100 appends |
| 1000 | About 1000 appends |
Pattern observation: The time grows roughly in a straight line as n increases.
Time Complexity: O(n)
This means the time to build the string grows directly with the number of characters added.
[X] Wrong: "Appending characters takes the same time no matter how long the string is."
[OK] Correct: Sometimes the internal array needs to grow, which takes extra time, but overall it still grows linearly.
Understanding how string building scales helps you write efficient code and explain your choices clearly in interviews.
"What if we used String concatenation (+) inside the loop instead of StringBuilder? How would the time complexity change?"
Practice
Which of the following statements about StringBuilder and StringBuffer is true?
Solution
Step 1: Understand thread safety difference
StringBufferis synchronized, making it thread-safe but slower.Step 2: Understand performance difference
StringBuilderis not synchronized, so it is faster but not thread-safe.Final Answer:
StringBuilderis faster but not thread-safe, whileStringBufferis thread-safe but slower. -> Option BQuick Check:
Thread safety and speed = A [OK]
- Confusing which class is thread-safe
- Thinking both have same speed
- Believing they cannot modify strings
Which of the following is the correct way to create a StringBuilder object with initial content "Hello"?
Solution
Step 1: Check constructor syntax
The correct way to create aStringBuilderwith initial content is usingnew StringBuilder("Hello").Step 2: Verify other options
StringBuilder sb = StringBuilder("Hello"); missesnew, StringBuilder sb = new StringBuilder(); sb.append("Hello"); is valid but not direct initialization, StringBuilder sb = new StringBuffer("Hello"); uses wrong class.Final Answer:
StringBuilder sb = new StringBuilder("Hello"); -> Option DQuick Check:
Correct constructor syntax = D [OK]
- Omitting 'new' keyword
- Using StringBuffer instead of StringBuilder
- Trying to assign without constructor
What is the output of the following code?
StringBuilder sb = new StringBuilder("Java");
sb.append(" Programming");
sb.replace(0, 4, "Python");
System.out.println(sb.toString());Solution
Step 1: Append " Programming" to "Java"
After append, string becomes "Java Programming".Step 2: Replace characters from index 0 to 4 with "Python"
Characters "Java" (index 0 to 4) are replaced by "Python", resulting in "Python Programming".Final Answer:
Python Programming -> Option CQuick Check:
Append + replace result = A [OK]
- Confusing replace indices
- Thinking append replaces text
- Ignoring toString() output
Identify the error in the following code snippet:
StringBuffer sb = new StringBuffer("Test");
sb.insert(5, "ing");
System.out.println(sb);Solution
Step 1: Check insert index validity
StringBuffer length is 4 ("Test"), but insert index is 5, which is out of bounds.Step 2: Understand exception thrown
Inserting at index greater than length throws IndexOutOfBoundsException.Final Answer:
IndexOutOfBoundsException because insert index is invalid -> Option AQuick Check:
Invalid insert index = B [OK]
- Assuming insert auto-corrects index
- Confusing insert with append
- Expecting no error on invalid index
You want to build a thread-safe string that appends numbers 1 to 3 separated by commas, resulting in "1,2,3". Which code snippet correctly uses StringBuffer to achieve this?
1. StringBuffer sb = new StringBuffer();
for (int i = 1; i <= 3; i++) {
sb.append(i);
if (i != 3) sb.append(",");
}
System.out.println(sb.toString());
2. StringBuffer sb = new StringBuffer();
for (int i = 1; i <= 3; i++) {
sb.append(i + ",");
}
System.out.println(sb.toString());
3. StringBuffer sb = new StringBuffer();
sb.append("1,2,3,");
System.out.println(sb.toString());
4. StringBuffer sb = new StringBuffer();
for (int i = 1; i < 3; i++) {
sb.append(i);
sb.append(",");
}
System.out.println(sb.toString());Solution
Step 1: Analyze snippet 1
Appends numbers 1 to 3 with commas except after last number, producing "1,2,3" correctly.Step 2: Check other snippets
Snippet 2 adds extra comma at end; snippet 3 hardcodes string but adds extra comma; snippet 4 misses last number 3.Final Answer:
Code snippet 1 -> Option AQuick Check:
Correct comma placement in loop = C [OK]
- Adding extra comma at end
- Missing last number in loop
- Hardcoding string without loop
Ready to prove it?
Pass the test and this pattern moves unknown
