String literals are interned automatically. Hence s1 == s3 is true. Strings can either be created in the string constant pool or they can be created in the heap space. If you intern a string created in the heap, the string will be in the string constant pool.
When you create a string literal (String s1 = "string one"), the string is created in the string constant pool. Additionally, the string constant pool doesn't store duplicates. So when you say,
String s1 = "string one";
String s3 = "string one";
Both s1 and s3 will be pointing to the same instance of the string in the string constant pool. So s1.equals(s3) will be true. And s1 == s3 also is true; since both the pointers are the same.
However, when you instantiate a string using the "new" constructor
String s2 = new String("string one");
then s2 is created in the heap space. The heap space is a different area of memory than the string constant pool
So while s1.equals(s2) is true, s1 == s2 is false; since they will be pointing to different areas of memory.
However, you can convert a string created using the "new" constructor to make it move to the string constant pool by invoking the intern() function. So s2.intern()
will return a string in the string constant pool; although s2 was originally created in the heap.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…