String.intern()方法的作用是:判断字符串常量池中是否存在一个引用,这个引用指向的字符串对象和当前对象相等(使用 equals 方法判断相等),如果存在直接返回这个引用,如果不存在则创建一个字符串对象并将其引用存入字符串常量池。JDK对其解释如下:
我们先来简单测试下:
现在看起来都符合我们预期,现在我们稍微改动下:
现在结果会有人迷惑,这里其实不仅涉及String.intern(),还涉及了+拼接字符串的优化,本质就是s7会被编译优化成"冰蛙",而s6则不会,我门反编译看下结果:
可见s6是通过StringBuilder的append方法实现拼接,调用toString方法创建一个新的String对象,而s7编译器已经做了优化,直接拼接得到结果。
String.intern()的应用场景
1.构建内存缓存设置对象属性时调用,减小内存开销
2.作为synchronized锁对象