关于StringBuilder中的toString方法

之前看到过几篇专门讲述字符串池的文章,我觉得写的非常好,但里面有几个问题让我比较疑惑,首先是字符串追加不在常量池分配存储空间问题,请看如下代码

img


之前了解到s.intern()方法先判断字符串池是否含有该字符串,若没有,jdk1.7后,该方法在字符串池中创建一个引用(指向堆中字符串对象地址)并返回,上述代码很明显s并未在字符串池中创建字符串对象,所以调用s.intern()方法在字符串池中创建了一个指向堆中字符串对象的引用并返回。之前了解到,两个字符串对象相加,相当于先转换成stringBuilder对象,在用append方法追加,最后调用stringBuilder的toString方法转换成string类型对象返回,请看toString源码

img


据之前了解到的,因为该toString返回调用的
String类的构造方法不是字面量形式的,所以不会在字符串池中存储字符串,为此,我敲了另一段代码来证明,请看

img


很明显,这段代码证明了上述结论,非字面量形式(我理解的字面量形式为String s = "abc"或
String s = new String("abc"))创建字符串对象不会在池中存储字符串,请在看一段代码

img


这次我直接采用创建stringBuilder对象,追加字符串并转换成String类对象,结果也证明了上述结论,非字面量形式创建String类对象并不会在池中存储字符串,但是,注意啦!请看如下代码

img


这次我又创建了StringBuilder对象并调用
toString方法转换成String类对象,唯一的不同是我并没有调用append方法追加,但这次的结果却不一样了。上述代码表明,s对象在堆中存储对象的同时,在字符串池中也存储了该字符串
因此,调用s.intern方法时,返回的是字符串池中的地址。
关于这一点,还请CSDN的各路大神求解,感谢

铁铁
看你的代码string是new出来的
所以他的intern方法的地址和他自己肯定一样啊
第二个你是tostring()
是重新开辟内存了
必须false啊