Solution 1:

I've used a memory profiler to get the exact counts.

On my machine, the first example creates 8 objects:

String s = "a";
s = s + "b";
s = s + "c";
  • two objects of type String;
  • two objects of type StringBuilder;
  • four objects of type char[].

On the other hand, the second example:

StringBuffer sb = new StringBuffer("a");
sb.append("b");
sb.append("c");

creates 2 objects:

  • one object of type StringBuilder;
  • one object of type char[].

This is using JDK 1.6u30.

P.S. To the make the comparison fair, you probably ought to call sb.toString() at the end of the second example.

Solution 2:

In terms of objects created:

Example 1 creates 8 objects:

String s = "a"; // No object created
s = s + "b"; // 1 StringBuilder/StringBuffer + 1 String + 2 char[] (1 for SB and 1 for String)
s = s + "c"; // 1 StringBuilder/StringBuffer + 1 String + 2 char[] (1 for SB and 1 for String)

Example 2 creates 2 object:

StringBuffer sb = new StringBuffer("a"); // 1 StringBuffer + 1 char[] (in SB)
sb.append("b"); // 0
sb.append("c"); // 0

To be fair, I did not know that new char[] actually created an Object in Java (but I knew they were created). Thanks to aix for pointing that out.