Java6 API
public String intern()
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
Returns:a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.官方文档:http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#intern()
优点:
1.intern()使得每个字符串都是字符串池中字符串的引用,而字符串池中的所有字符串都是唯一的,可以节省内存;
2.通过引用来比较字符串的速度更快(==比equals(object)速度快)。
缺点:
1.为了确保字符串池中的字符串都是唯一的,需要做大量工作;
2.必须确保对所有的字符串都用了intern()方法,这样对他们比较时才能都用==,而且这种想法必须让团队中的所有成员知道;
3.intern()后的字符串都存储在PermGen空间中,这个空间相对较小,因此会导致OutOfMemoryError ,即便此时空闲栈空间还很充足。
参考文章:
https://blog.codecentric.de/en/2012/03/save-memory-by-using-string-intern-in-java/
http://stackoverflow.com/questions/1091045/is-it-good-practice-to-use-java-lang-string-intern