首页 > 其他 > 详细

String.intern

时间:2021-05-10 10:46:32      阅读:20      评论:0      收藏:0      [点我收藏+]

参考连接:https://www.jianshu.com/p/be66e22f5fc8      可以联系我删除本博客

  我们知道再jvm的运行时内存可以分为堆、方法区、程序计数器、虚拟机栈和本地方法栈。而在方法区中有一个字符串常量池,用来保存字符串这个不可变量。如果我们使用String str=new String("java虚拟机")来new一个string对象,则该对象的实例保存在堆中。如果我们使用String str="java虚拟机"来创建一个字符串,jvm首先会在字符串常量池中创建该String的实例,然后将常量池中该实例的引用返回给str。
new出来的String保存在堆中,如果我们想让字符串常量池中也保存该string的实例呢?可以使用String.intern()这个方法将字符串复制到常量池中,返回在常量池中的引用。

  但是在jdk1.7以后,使用String.intern()方法和之前有一些不同。如果字符串在字符串常量池中没有出现过,就会在字符串常量池中保存一个引用,指向堆中该字符串的实例。如果字符串在常量池中已经存在了,就返回常量池中的引用。
我们看一下如下的代码

    public static void main(String[] args) {
        String str1=new StringBuilder("java").append("虚拟机").toString();//执行完这行代码后,常量池中会有"java"和"虚拟机",但是不会有"java虚拟机"。
        System.out.println(str1.intern()==str1);
        String str2=new String("我喜欢java");  //执行完这行代码后,常量池中会有"我喜欢java"
        System.out.println(str2==str2.intern());

true
false

分析

str1指向的实例是在堆中,是由“java”和"虚拟机"拼接成的。执行完第一句代码后,执行完这句话后,常量池中会有"java"和"虚拟机",但是不会有"java虚拟机"。然后使用str1.intern()会在常量池中保存str1实例的引用,并且返回引用,因此str1.intern()==str1。
而执行完String str2=new String("我喜欢java");后,常量池中会有"我喜欢java",所以在使用str2.intern()返回的就是字符串常量池中的引用,而str2指向的是堆中的引用,因此str2!=str2.intern()。




 



String.intern

原文:https://www.cnblogs.com/shuai666/p/14749740.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!