Monday, 16 June 2014

Why String is immutable or final in java?

            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 s1="nrk infotech";
                  String s2="nrk infotech";

           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.
    Immutable objects are much better suited to be Hashtable keys.
For example,
                           String s1="one";
                           HashMap<String,Integer>  map =  new HashMap<String,Integer>();
                           map.put(s1,new Integer(1));
                           s1.concat("two");
                           System.out.println(map.get(s1));
    In the above code,s1 value won't change whenever you are calling map.get(s1) so it will work properly.
  For Example ,in case of StringBuffer,
                          StringBuffer s1=new StringBuffer("one");
                          HashMap<String,Integer>  map =  new HashMap<String,Integer>();
                          map.put(s1,new Integer(1));
                          s1.append("two");
                          System.out.println(map.get(s1));     //here s1=onetwo

 In the above code it will return null.

                 
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.


4. Thread Safety

                 Immutable objects are thread-safe. Two threads can both work on an immutable object at the same time without any possibility of conflict. No external synchronization is required.
 

Related Post:--
1) What are the immutable classes in java?&how to create immutable class& what are the conditions?
2) String Related interview questions & Answers

No comments:

Post a Comment