Why String is Immutable or Final in Java? Explained (original) (raw)

The string is Immutable in Java because String objects are cached in the String pool. Since cached String literals are shared between multiple clients there is always a risk, where one client's action would affect all other clients. For example, if one client changes the value of the String "Test" to "TEST", all other clients will also see that value as explained in the first example. Since caching of String objects was important for performance reasons this risk was avoided by making the String class Immutable. At the same time, String was made final so that no one can compromise invariant of String class like Immutability, Caching, hashcode calculation, etc by extending and overriding behaviors. Another reason why the String class is immutable could die due to HashMap.

Since Strings are very popular as the HashMap key, it's important for them to be immutable so that they can retrieve the value object which was stored in HashMap. Since HashMap works in the principle of hashing, which requires the same has value to function properly. Mutable String would produce two different hashcodes at the time of insertion and retrieval if contents of String were modified after insertion, potentially losing the value object in the map.

If you are an Indian cricket fan, you may be able to correlate with my next sentence. The string is VVS Laxman of Java, i.e. very very special class. I have not seen a single Java program that is written without using String. That's why a solid understanding of String is very important for a Java developer.

Important and popularity of String as data type, transfer object, and the mediator has also made it popular in Java interviews. Why String is immutable in Java is one of the most frequently asked String Interview questions in Java, which starts with a discussion of, what is String, how String in Java is different than String in C and C++, and then shifted towards what is an immutable object in Java, what are the benefits of an immutable object, why do you use them and which scenarios should you use them. This question sometimes also asked, "Why String is final in Java".

On a similar note, if you are preparing for Java interviews, I would suggest you take a look at the Java Programming interview exposed book, an excellent resource for senior and mid-level Java programmers. It contains questions from all important Java topics including multi-threading, collection, GC, JVM internals, and frameworks like Spring and Hibernate, as shown below:

Why String is Final in Java? Answered

As I said, there could be many possible answers to this question, and the only designer of the String class can answer it with confidence. I was expecting some clue in Joshua Bloch's Effective Java book, but he also didn't mention it. I think the following two reasons make a lot of sense on why String class is made immutable or final in Java:

1. String Pool

Imagine String pool facility without making string immutable, it's not possible at all because in the case of string pool one string object/literal e.g. "Test" has referenced by many reference variables, so if any one of them change the value others will be automatic gets affected i.e. let's say

String A = "Test" String B = "Test"

Now String B called, "Test".toUpperCase() which change the same object into "TEST", so A will also be "TEST" which is not desirable. Here is a nice diagram that shows how String literals are created in heap memory and String literal pool.

Why String is Immutable or Final in Java

2. Security

String has been widely used as a parameter for many Java classes like for opening network connection, you can pass hostname and port number as a string, you can pass database URL as a string for opening database connection, you can open any file in Java by passing the name of the file as an argument to File I/O classes.

In case, if String is not immutable, this would lead serious security threat, I mean someone can access any file for which he has authorization, and then can change the file name either deliberately or accidentally and gain access to that file.

Because of immutability, you don't need to worry about that kind of threat. This reason also gels with, Why String class is final in Java, by making java.lang.String final, Java designer ensured that no one overrides any behavior of String class.

3. Thread safety

Since String is immutable it can safely share between many threads which are very important for multithreaded programming and to avoid any synchronization issues in Java, Immutability also makes String instance thread-safe in Java, which means you don't need to synchronize String operation externally. Another important point to note about String is the memory leak caused by SubString, which is not a thread-related issue but something to be aware of.

4. Caching

Another reason Why String is immutable in Java is to allow String to cache its hashcode, being immutable String in Java caches its hashcode, and do not calculate every time we call the hashcode method of String, which makes it very fast as a hashmap key to be used in hashmap in Java.

This one is also suggested by Jaroslav Sedlacek in the comments below. In short, because String is immutable, no one can change its contents once created which guarantees the hashCode of String to be the same on multiple invocations.

5. Class Loading

Another good reason Why String is immutable in Java suggested by Dan Bergh Johnsson in comments is: The absolutely most important reason that String is immutable is that it is used by the class loading mechanism, and thus have profound and fundamental security aspects.

Had String been mutable, a request to load "java.io.Writer" could have been changed to load "mil.vogoon.DiskErasingWriter"

In short, Security and String pool being the primary reasons for making String immutable, I believe there could be some more very convincing reasons as well, Please post those reasons as comments and I will include those on this post.

By the way, the above reason holds good to answer, another Java interview question "Why String is final in Java". Also to be immutable you have to be final so that your subclass doesn't break immutability. what do you guys think?

Other Java String articles and tutorials you may like

And, if you prefer to watch than read then you can also check out this tutorial on our Youtube channel where we have talked about why String is Immutable and Final in Java. If you haven't subscribed to our Youtube channel and want to receive notifications about new tutorials, you can subscribe to our Youtube channel here.

Thanks for reading this article so far. If you like this Java interview question and my explanation then please share it with your friends and colleagues. If you have any questions or feedback then please drop a note.

P. S. - If you are new to Java programming and want to learn Java from scratch then you can also check out these **best websites to learn Java Programming and development **for free. It's a great collection of online learning platforms for Java developers.