-
在1.6及以前的JDK中,常量池是放在方法区的(非堆),(被字符串实例调用的)intern()方法会在调用时先去常量池中查看是否有相同的字符串(equals()),如果有那就返回常量的引用,如果没有就复制字符串实例放到常量区,然后再返回对常量的引用。
jdk6canstantpool.jpg
jdk6.jpg
-
在1.7及以后的JDK中,常量池从方法区挪到了堆区,(被字符串实例调用的)intern()方法会在调用时先去常量池中查看是否有相同的字符串(equals()),如果有那就返回常量的引用,如果没有也不会复制字符串实例放到常量区,而是复制堆上的该字符串实例的引用到常量区, 然后再返回常量区的对应引用。
jdk7constant pool.jpg
练习:
String str1 = new String("Hello")+ new String("World");
System.out.println(str1.intern() == str1);
System.out.println(str1 == "HelloWorld");
jdk1.6及以前版本为false false,
jdk1.7及以后版本为true ture。
String str2 = "HelloWorld";//新加的一行代码,其余不变
String str1 = new String("Hello")+ new String("World");
System.out.println(str1.intern() == str1);
System.out.println(str1 == "HelloWorld");
jdk1.6及以前版本为false false,
jdk1.7及以后版本为false false。
网友评论