Java 虚拟机

理解java中String类的intern()方法

2018-12-15  本文已影响0人  水石间
  1. 在1.6及以前的JDK中,常量池是放在方法区的(非堆),(被字符串实例调用的)intern()方法会在调用时先去常量池中查看是否有相同的字符串(equals()),如果有那就返回常量的引用,如果没有就复制字符串实例放到常量区,然后再返回对常量的引用。


    jdk6canstantpool.jpg
    jdk6.jpg
  2. 在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。

参考并感谢:
String中intern方法的作用
你真的了解String类的intern()方法吗

上一篇 下一篇

猜你喜欢

热点阅读