The Java designers recognized that many many security holes are created by sloppy handling of strings. Therefore they made modification of an existing string variable impossible. This also has other advantages - for example the intern() method saves storage space. Bill
...and given that String is immutable, the reason for the existence of StringBuffer should be obvious -- sometimes you want to be able to alter a sequence of characters.