Is Java's String Intern a flyweight?

后端 未结 6 1457
醉酒成梦
醉酒成梦 2020-12-11 02:10

Does the implementation of Java\'s String memory pool follows flyweight pattern?

Why I have this doubt is, I see that there is no extrinsic state involved in Intern.

6条回答
  •  星月不相逢
    2020-12-11 02:30

    Yes the String.intern() implementation follows the flyweight pattern.

    As the javadoc says

    Returns a canonical representation for the string object. 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(Object) method, 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. String literals are defined in §3.10.5 of the Java Language Specification

    The internalized strings reside in the "Perm Gen" space and on string objects returned by .intern() you can use the operator == because .intern() returns always the same object for equal values.

    Then remember that .intern() method does not produce leaks, because the JVM today is able garbage the pool.

    Try to read this article too.

提交回复
热议问题