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,因此是不一样的
10
相似问题