The long answer is available here, so I'll give you the short one.
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.