String Constant Pool: Understanding Interning and the "new" Operator
In Java, string literals, such as "abc," are interned, meaning they are stored in the String constant pool, and references to them are shared. However, when a new String object is created using the "new" operator, a new object is created in memory rather than referencing an existing one in the pool.
Conflicting statements regarding this behavior have led to misunderstandings. While the JVM checks for existing strings in the pool when encountering a literal, this check only applies to strings that are actually interned. If a literal is referenced in non-pool memory (using "new"), a new object is created, even if a matching string already exists in the pool.
To illustrate this, consider the following code:
<code class="java">String one = new String("test"); String two = "test";</code>
"test" is a literal that is interned, so a reference to it is already in the pool. However, when one is created using "new," a new String object is allocated in memory, meaning it has a different reference from two.
<code class="java">System.out.println(one.equals(two)); // true System.out.println(one == two); // false</code>
The equals() method compares the strings' values, which are the same, but the == operator compares their references, which are different.
The confusion may arise from statements that imply strings created using "new" are still placed in the pool, but this is misleading. While a string with the same value as the literal may exist somewhere in memory, it is not added to the pool and is not accessible through the literal itself.
Therefore, when using the "new" operator, the JVM creates a new String object in memory instead of returning a reference to an existing one from the pool, even if one exists with the same value.
The above is the detailed content of Why does \'new String()\' create a new object, even if a string with the same value already exists in the String constant pool?. For more information, please follow other related articles on the PHP Chinese website!