http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#intern()
基本上是做弦乐.一系列字符串上的intern()将确保具有相同内容的所有字符串共享相同的内存.所以,如果你有一个名字列表,其中"john"出现了1000次,那么通过实习,你可以确保只有一个"john"实际分配了内存.
这有助于减少程序的内存需求.但是请注意,缓存是由JVM在永久内存池中维护的,与堆相比,永久内存池的大小通常是有限的,所以如果没有太多重复值,就不应该使用intern.
更多关于使用intern()的内存限制的信息
一方面,确实可以通过以下方式删除字符串重复项 把它们内化.问题是内部化的字符串转到 永久生成,这是JVM中保留的一个区域 对于非用户对象,如类、方法和其他内部JVM 对象.这个区域的大小是有限的,而且通常要小得多. 而不是堆在一起.对字符串调用intern()具有移动的效果 它从堆里出来进入永久的世代,你会冒着风险 PermGen空间不足.
--
从JDK7(我指的是HotSpot)开始,有些东西发生了变化.
在JDK 7中,被占用的字符串不再在Java堆的永久生成中分配,而是与应用程序创建的其他对象一起分配在Java堆的主要部分(称为年轻代和老代)中.此更改将导致更多数据驻留在主Java堆中,而在永久生成中的数据更少,因此可能需要调整堆大小.由于此更改,大多数应用程序在堆使用方面只会看到相对较小的差异,但是加载许多类或大量使用String.intern()方法的较大应用程序将会看到更显著的差异.
--从Java SE 7 Features and Enhancements
更新:从Java7开始,插入的字符串存储在主堆中.http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html#jdk7changes