Ryan is a Java developer working in software engineering research. His research mainly focuses on source code analysis and development tools. Ryan has posted 24 posts at DZone. You can read more from them at their website. View Full User Profile

Why String is Immutable in Java ?

07.29.2013
| 48902 views |
  • submit to reddit

This is an old yet still popular question. There are multiple reasons that String is designed to be immutable in Java. A good answer depends on good understanding of memory, synchronization, data structures, etc. In the following, I will summarize some answers.

1. Requirement of String Pool

String pool (String intern pool) is a special storage area in Java heap. When a string is created and if the string already exists in the pool, the reference of the existing string will be returned, instead of creating a new object and returning its reference.

The following code will create only one string object in the heap.

String string1 = "abcd";
String string2 = "abcd";

Here is how it looks:
java-string-pool

If string is not immutable, changing the string with one reference will lead to the wrong value for the other references.

2. Allow String to Cache its Hashcode

The hashcode of string is frequently used in Java. For example, in a HashMap. Being immutable guarantees that hashcode will always the same, so that it can be cashed without worrying the changes.That means, there is no need to calculate hashcode every time it is used. This is more efficient.

3. Security

String is widely used as parameter for many java classes, e.g. network connection, opening files, etc. Were String not immutable, a connection or file would be changed and lead to serious security threat. The method thought it was connecting to one machine, but was not. Mutable strings could cause security problem in Reflection too, as the parameters are strings.

Here is a code example:

boolean connect(string s){
    if (!isSecure(s)) { 
throw new SecurityException(); 
}
    //here will cause problem, if s is changed before this by using other references.    
    causeProblem(s);
}

In summary, the reasons include design, efficiency, and security. Actually, this is also true for many other “why” questions in a Java interview.

Published at DZone with permission of its author, Ryan Wang. (source)

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)

Comments

Mason Mann replied on Mon, 2013/07/29 - 2:14am

4. Correctness

David Whatever replied on Mon, 2013/07/29 - 4:45am

4. collection safety. maps don't support mutations of keys, and strings are the most popular object to use as a key

5. defensiveness, you don't have to worry about a method you are calling changing the string out from under you

6. performance, there is an additional level of indirection needed to support sharing strings across some mutations (like growing the string)

7. thread safety/performance. the easiest way to guarantee safety and to cut down on use of synchronized blocks is to make your data immutable.

Snehal Masne replied on Sat, 2013/11/30 - 12:36am

One of the best and simplest explanation I found for String being immutable. Thanks for this. 

Keep it up!  

Regards,

www.Techproceed.com  

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.