总结
一 创建了几个对象?
String s = new String("1");
在jdk1.6中,创建了2个。
分别是常量池中得对象1
,和堆中得对象s(值也为1)
二 jdk6和7中intern的
差别
注意这是intern的步骤,不是所有字符串创建的步骤
jdk1.6中字符串常量池存放在永久代
中:
当使用intern()方法时,查询字符串常量池是否存在当前字符串,若不存在则将当前字符串复制到字符串常量池
中,并返回字符串常量池中的引用。
jdk1.7中字符串常量池存放在堆
中:
当使用intern()方法时,先查询字符串常量池
是否存在当前字符串,若字符串常量池中不存在则再从堆中查询
,然后存储并返回相关引用
;
若都不存在则将当前字符串复制到字符串常量池
中,并返回字符串常量池中的引用。
三 示例一
String s = new String("1");
s.intern();
String s2 = "1";
System.out.println(s == s2);
String s3 = new String("1") + new String("1");//区别,这步不会再常量池中创建和s3等值的字符串
s3.intern();
String s4 = "11";//上面的intern导致常量池中已存在了11字符串
System.out.println(s3 == s4);
jdk6:false false
jdk7:false true
四 示例二
String s = new String("1");
String s2 = "1";
s.intern();
System.out.println(s == s2);
String s3 = new String("1") + new String("1");
String s4 = "11";//提前导致直接再字符串常量池创建了11。一直强调:上面的步骤是intern的步骤
s3.intern();
System.out.println(s3 == s4);
jdk6;false false
jdk7:false false
为什么String s4 = "11"
会导致结果变化?
这行代码在常量池中找字符串时,可不会像intern的步骤一样!!!
网友评论