Re: Doubt in Strings
In article
<296bc778-be4c-4bea-bfb9-2a64486e0259@l31g2000yqb.googlegroups.com>,
neuneudr@yahoo.fr wrote:
On Jul 4, 12:30 pm, "John B. Matthews" <nos...@nospam.invalid> wrote:
...
<code>
public class InternTest {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = new String(str1).intern();
String str3 = new String(str1);
System.out.println(str1 == str2);
System.out.println(str1 == str3);
}}
</code>
Hi John and all,
but regarding the OP's question, concerning "object creation" [sic]...
In your:
String str2 = new String(str1).intern();
you're still creating a new object, that shall be
eligible for GC right after the call to intern() no?
The expression "new String(str1).intern()" includes two steps: 1) An
anonymous new copy of str1 is created; and 2) that copy is found among
the interned Strings, and a reference to it is returned in str2. As there
is no outstanding reference to the intermediate copy, it is eligible for
collection; but the interned String, referenced by str2, is ineligible
until it goes out of scope or is explicitly nulled:
<http://www.javaworld.com/javaworld/javaqa/2003-12/01-qa-1212-intern.html>
Which is quite different from how String literals are interned,
at least from the OP's "object creation" point of view?
I don't see this. The reference in str1 is obtained by loading a constant
determined at compile time. The reference in str2 is returned by
intern(). These two references are identical. The reference in str3 is
obtained by invoking the relevant String constructor, which creates a
copy. As a result, the reference in str3 is different.
--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>