String字符串性能优化的几种方案(19)

执行第二部分:

1.new String(\"ab\")+new String(\"cd\") , 先在常量池里生成“ab\"和”cd\" , 再在堆中生成“abcd\";

2.执行s3.intern()时 , 会把“abcd”的对象引用放到字符串常量池里 , 发现常量池里还没有该引用 , 故可成功放入 。 当String s4=\"abcd\" , 即把字符串常量池中”abcd“的引用地址赋值给s4 , 相当于s4指向了堆中”abcd\"的地址 , 故s3==s4为true 。

1.8版本

false true

参考网上一些博客 , 在1.8版本当中 , 使用intern()时 , 执行原理如下:

若字符串常量池中 , 包含了与当前对象相当的字符串 , 将返回常量池里的字符串;若不存在 , 则将该字符串存放进常量池里 , 并返回字符串的引用 。

综上所述 , 可见三种版本当中 , 使用intern时 , 若字符串常量池里不存在相应字符串时 , 存在以下区别:

例如:

推荐阅读