深入理解JVM 一书中的 Stringbuilder.toString().intern() 判断
最近闲来无事翻阅这本书的时候,关于JDK1.7版本中字符串常量池的部分的demo有点云里雾里的。后来研究了一下,总结如下
1、String str = new StringBuilder("aa").toString();
System.out.println(str.intern() == str); // 这个返回false 因为创建str 的过程中,在请求参数中已经创建了"aa" ,至此常量池中有了,后面的toString()查看源码发现,创建了新对象。这个地方就和原先的不一样了,
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
// 同理 下面的也因为上面已经创建了,toString的时候又创建了新的对象,导致还不通
2、String str1 = new StringBuilder("a").append("a").toString();
System.out.println(str1.intern() == str1); // 这个返回 false
3、如果在一个类代码里面,第一次创建这个对象的数值,则为true
String a =new StringBuilder().append("ja").append("va").toString();
System.out.println(a.intern() == a);// true 两次append 之后toSting ,因为之前没有这个”java“,所以常量池也存放一个
网友评论