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

  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()方法吗

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容