new String和调用intern() 的关系

来源:互联网 发布:网络营销策划方案例文 编辑:程序博客网 时间:2024/06/04 23:28

一、变量地址改成intern 池中地址,还是保持堆地址不变

   当new String 一个对象时,想把字符存入Intern池中,哪么调用.intern().

      jvm 首先查找:如有池中没有,则在池中建立一个字符串,返回地址,哪么变量的地址指向池中新建的地址。

                           如有池中有了,则变量的地址不变,还是堆地址,但是.intern()=Intern池中地址

1、例子1

String str1 = new String("you")+ new String("can");      
System.out.println(str1.intern() == str1);   
System.out.println(str1 == "youcan"); true
true

 2、例子2

   String str2 = "youcan";//新加的一行代码,其余不变  
String str1 = new String("you")+ new String("can");      
System.out.println(str1.intern() == str1);   
System.out.println(str1 == "youcan"); false
false

3、图形解释

    图1:str1.intern(),首先看Intern 池有没有youcan,没有则Intern 池建立一个 youcan,返回地址01,str1地址由堆地址=04改成=池中01

      str1.intern() =01=str1,youcan=01=str1

    图2:str1.intern(),首先看Intern 池有没有youcan,有则返回地址str1.intern()=01, 但是str地址不变,还是堆地址=04

           str1.intern()=01 不等于 str=04 false

          youcan=01 不等于 str1=04 false

              




原创粉丝点击