一、变量地址改成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
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
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