Posts Tagged ‘String’

String literal vs String object in Java

September 7th, 2011 No comments

If you’re a Java developer, you might have ever been in trouble distinguishing String literal and String object. I myself have had the trouble too. So I make a search on the internet for this topic and collect good articles for everyone to memorize.

Full topic:


what is difference between String str = new String(“abc”); and String str = “abc”;

Good answer

When you do this:

String str = "abc";

You are calling the intern() method on String. This method references an internal pool of ‘String’ objects. If the String you called intern() on already resides in the pool, then a reference to that String is assigned to str. If not, then the new String is placed in the pool, and a reference to it is then assigned to str.

Given the following code:

String str = "abc";
String str2 = "abc";
boolean identity = str == str2;

When you check for object identity by doing == (you are literally asking – do these two references point to the same object?), you get true.

However, you don’t need to intern() Strings. You can force the creation on a new Object on the Heap by doing this:

String str = new String("abc");
String str2 = new String("abc");
boolean identity = str == str2;

In this instance, str and str2 are references to different Objects, neither of which have been interned so that when you test for Object identity using ==, you will get false.

In terms of good coding practice – do not use == to check for String equality, use .equals() instead.

Method description of java.lang.String


public String intern()
Returns a canonical representation for the string object.A pool of strings, initially empty, is maintained privately by the class String.

When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.

It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.

All literal strings and string-valued constant expressions are interned. String literals are defined in §3.10.5 of the Java Language Specification

a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.