A FastStringBuffer can be implemented using lazy-evaluated streams.
How LazyEvaluation helps:
Make your string be like a linked list, except the "next" field does not contain a pointer, but some unevaluated code, or a function. You run that code or call that function to retrieve the rest of the list. This way, complex manipulations on strings are possible, a la HaskellLanguage.
Or you could just duplicate the functionality of the built-in StringBuffer class but without the pointless synchronisation of methods.