
StringTable特性有这些
1.常量池中的字符串仅是符号,第一次用到时才变为对象
2.利用串池的机制,来避免重复创建字符串对象
3.字符串变量拼接的原理是StringBuilder (1.8)
4.字符串常量拼接的原理是编译期优化
5.可以使用intern方法,主动将串池中还没有的字符串对象放入串池
前4点,我们在前面的章节也都讲述了,我们看第5点特性。
在前面29章的时候,简单提了一下intern方法是可以将堆中的字符串对象,放入串池中。我们来看看。
我们先看这个例子:
package design.wlb.studyjava.demo.restudy.c4jvm专题.chapter02.c32StringTable_intern_jdk8; public class Client { //StringTable["a","b"] public static void main(String[] args) { String s = new String("a") + new String("b"); //new StringBuilder new String("ab") //堆 new String("a") new String("b") new String("ab") String s2 = s.intern(); //我们知道现在ab是在堆中,并不在串池,我们调用intern方法将其放入串池 StringTable["a","b","ab"] //将这个字符串对象尝试放入串池中,如果有则并不会放入,如果没有则放入串池,会把串池中的对象返回。 System.out.println(s2 == "ab"); //true System.out.println(s == "ab"); //true } }String s = new String("a") + new String("b"); 我们知道现在s这个"ab"是在堆中,并不在串池,我们调用intern方法将其放入串池 intern方法会将字符串对象尝试放入串池中,如果有则并不会放入,如果没有则放入串池,会把串池中的对象返回。(细品)经过了intern方法后,我们查看s2 == "ab"是 true , s =="ab" 是true.
好,那我们变一变,一来就让ab字符串进入串池,s2 == "ab", s == "ab" 结果又是如何呢?
package design.wlb.studyjava.demo.restudy.c4jvm专题.chapter02.c32StringTable_intern_jdk8; public class Client2 { //StringTable["a","b"] public static void main(String[] args) { String x = "ab"; String s = new String("a") + new String("b"); //new StringBuilder new String("ab") //堆 new String("a") new String("b") new String("ab") String s2 = s.intern(); //我们知道现在ab是在堆中,并不在串池,我们调用intern方法将其放入串池 StringTable["a","b","ab"] //将这个字符串对象尝试放入串池中,如果有则并不会放入,如果没有则放入串池,会把串池中的对象返回。 System.out.println(s2 == "ab"); //true [s2直接返回的是串池中的ab,故而是相等的,但s它没放进去,所以s没变] System.out.println(s == "ab"); //false } }可以看到s2 == "ab" 是true , s == "ab"是 false,为什么和第一个例子不一样了呢?那是因为,当执行String x = "ab"时,jvm已经将"ab"放入串池中,而s本身是堆的对象,它执行了intern方法,但是由于串池里面有"ab"了,s放入堆的操作就被忽略了,但s2的值就直接从串池中取了。所以s2 == "ab" 为true , s == "ab" 答案为false.
好,这一篇就讲到这里。
版权声明:本文为tgbyhn31原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

