String Pool in Java: How It Works and Why It Matters
The
String pool in Java is a special memory area where string literals are stored to save memory by reusing identical strings. When you create a string literal, Java checks the pool first and returns the existing string if found, avoiding duplicate objects. This helps improve performance and memory efficiency.Syntax
The String pool works automatically with string literals and the intern() method.
String s = "hello";creates or reuses a string in the pool.String s2 = new String("hello");creates a new object outside the pool.s2 = s2.intern();adds the string to the pool or returns the existing one.
java
String s1 = "hello"; String s2 = new String("hello"); String s3 = s2.intern();
Example
This example shows how string literals share the same object in the pool, while strings created with new do not, unless intern() is used.
java
public class StringPoolExample { public static void main(String[] args) { String s1 = "java"; String s2 = "java"; String s3 = new String("java"); String s4 = s3.intern(); System.out.println(s1 == s2); // true, same pool object System.out.println(s1 == s3); // false, different objects System.out.println(s1 == s4); // true, s4 refers to pool object } }
Output
true
false
true
Common Pitfalls
Many beginners expect == to compare string content, but it compares references (memory addresses). Strings created with new are not in the pool by default, so == returns false even if contents match. Always use equals() to compare string content.
Also, forgetting to use intern() when needed can cause unexpected memory use or comparison results.
java
String a = new String("test"); String b = "test"; // Wrong: compares references System.out.println(a == b); // false // Right: compares content System.out.println(a.equals(b)); // true // Using intern to get pool reference String c = a.intern(); System.out.println(b == c); // true
Output
false
true
true
Quick Reference
| Concept | Description |
|---|---|
| String literal | Stored in the String pool automatically |
| new String() | Creates a new object outside the pool |
| intern() | Adds string to pool or returns existing pool string |
| == operator | Compares references, not content |
| equals() method | Compares string content |
Key Takeaways
Java String pool stores string literals to save memory by reusing objects.
Use string literals or intern() to ensure strings are in the pool.
Never use == to compare string content; use equals() instead.
new String() creates a new object outside the pool unless intern() is called.
String pool improves performance and reduces memory usage.