Originally posted by Tony Morris:
Even the same String literal may not use the same String instance (contrary to JLS 3.10.5).
20.12.47 public String intern()
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 method (�20.12.9), 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 (�3.10.5).
As Strings literals are mantained in string pool of the String class, string objects won't be elegible for garbage collection until String class is unloaded.
Originally posted by Jim Yingst:
It looks like in Sun's implementation, String pools exist on a per-ClassLoader basis. There's only one String class, but there can be more than one pool.