Variables whether they refer to primitives or objects are always passed by value. With primitives, the value passed is a copy of the bit pattern the variable has been assigned. With objects, the value is a copy of the memory location of the object being referenced. Strings being objects are no different in this respect but they are immutable. The decision to make them so appears to have been based on performance and memory efficiency as discussed below:
From: Sun Certified Programmer & Developer for Java 2 Study Guide (Exam 310-035 & 310-027) by Kathy Sierra (Editor), Bert Bates (Editor)
One of the key goals of any good programming language is to make efficient use of memory. As applications grow, it�s very common that String literals occupy large amounts of a program�s memory, and that there is often a lot of redundancy within the universe of String literals for a program. To make Java more memory efficient, the JVM sets aside a special area of memory called the �String constant pool.� When the compiler encounters a String literal, it checks the pool to see if an identical String already exists. If a match is found, the reference to the new literal is directed to the existing String, and no new String literal object is created. (The existing String simply has an additional reference.) Now we can start to see why making String objects immutable is such a good idea. If several reference variables refer to the same String without even knowing it, it would be very bad if any of them could change the String�s value.