用的jdk1.8
请看下面的截图
当我不声明a字符串时,s==s.intern() 为true,声明了以后却为false,什么原因?
首先 new StringBuilder(“aa”).append(“a”),在编译时常量池就存在了 “aa"和"a”,但是不存在"aaa",s的指向"aaa"在堆中的地址,首次调用s.intern()会在常量池中加入"aaa",并返回s的引用,所以为true,当声明a="aaa"时,会直接去常量池找有没有,有的话,a变量就直接指向“aaa”在常量池中的地址,第二次调s.intern也是指向的常量池中的地址,所以为false
确定的字符串在编译器就已经在常量池存在引用了,所以 new StringBuilder(“aaa”).toString() 和 new StringBuilder().append(“aaa”).toString() 效果是一样的,运行System.out.println(s==s.intern()) 一定是false ,因为编译期常量池就存在了"aaa"。 而new StringBuilder(“aa”).append(“a”).toString();在编译器只存在"aa" 和 “a”, s的值只存在堆中,s.intern()会在常量池加载"aaa"并返回a的引用,所以比较结果为true