intern

来源:6-12 Java内存模型之常考题解析-2

Joker4411416

2019-05-30

String s = new String(“a”);
s.intern();
String s2 = “a”;
System.out.println(s == s2);
翔仔哥,在上面段代码中,在JDK8中,String s = new String(“a”);首先“a”被存放到常量池中,然后new了之后,在java堆中创建a对象,调用s.intern(),发现字符串常量池中存在a,就会返回该字符串的引用给s?,不就就没有否则之后的条款了吗

所以如果常量池中先前已创建出该字符串对象,则返回该字符串的引用,这句话到底什么意思,是返回给s吗,那返回了s==s2不就是true了吗?

图片描述

写回答

1回答

翔仔

2019-05-31

同学好,这段程序的执行结果的false,原因是因为String s = new String(“a”); 会在堆和常量池都创建一个a;而当调用intern方法的时候,也就是尝试将堆中"a"对象的引用放入到字符串常量池的时候发现常量池中已经有"a"对象了,此时就啥都不做;而当执行到String s2= "a"的时候,会将常量池中的"a"引用返回(如果字符串常量池先前已创建出该字符串对象)。此时System.out.println(s == s2);  s来源于堆中的a,而s2来源于常量池中的a,因此是不一样的

1
0

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8441 学习 · 1872 问题

查看课程