Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is Java's String Intern a flyweight?

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. In GoF I read that there should be a right balance between intrinsic and extrinsic state. But in intern everything is intrinsic.

Or shall we say there is no strict rule with respect to attributes and just sharing objects to reduce memory is sufficient to call it a flyweight.

Please help me understand.

like image 859
Joseph Kulandai Avatar asked Jun 25 '12 12:06

Joseph Kulandai


People also ask

What is intern () in String class?

The method intern() creates an exact copy of a String object in the heap memory and stores it in the String constant pool. Note that, if another String with the same contents exists in the String constant pool, then a new object won't be created and the new reference will point to the other String.

What is flyweight in Java?

Flyweight is a structural design pattern that allows programs to support vast quantities of objects by keeping their memory consumption low. The pattern achieves it by sharing parts of object state between multiple objects.

Which design pattern does string pool use?

String pool is an example of the Flyweight Design Pattern.


1 Answers

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.

like image 185
dash1e Avatar answered Oct 14 '22 12:10

dash1e