字符串对象在JVM中可能有两个存放的位置:字符串常量池或堆内存。
另外String提供了一个API, java.lang.String.intern(),这个API可以手动将一个字符串对象的值转移到字符串常量池中
JDK1.7之后虽然字符串常量池也转换到了堆中,但是其实字符串常量池是在堆中独立开辟的空间,我们创建一个普通字符串和一个字符串对象结构类似于下图
这里其实我们可以看出一些intern()的特性了.
我们来看intern方法的实现,intern方法的底层是一个native方法,在Hotspot JVM里字符串常量池它的逻辑在注释里写得很清楚.
在Java应用恰当得使用String.intern()方法有助于节省内存空间,但是在使用的时候,也需要注意,因为StringTable的大小是固定的,如果常量池中的字符串过多,会影响程序运行效率。