58同城面试题---intern()方法解析

public class InternTest {
    public static void main(String[] args) {
        String str1 = new StringBuilder("58").append("tongcheng").toString();
        System.out.println(str1);
        System.out.println(str1.intern());
        System.out.println(str1==str1.intern());
        String str2 = new StringBuilder("ja").append("va").toString();
        System.out.println(str2);
        System.out.println(str2.intern());
        System.out.println(str2==str2.intern());
    }
}

如图,如果运行这段代码,控制台会打出什么呢?

58同城面试题---intern()方法解析_第1张图片

 第二个结果是false,明明一样的方式获取的字符串对比结果为什么会不一样呢?

是打开方式出问题了吗?我换个字符串再试试:58同城面试题---intern()方法解析_第2张图片

由此可见,并不是我打开方式有问题,但是为啥'java'就这么特殊呢?先看看intern()这个方法是啥意思

--引用自周志明老师的深入理解java虚拟机.

方法区和运行时常量池溢出

由于运行时常量池是方法区的一部分,因此这两个区域的溢出测试就放在一起进行。前面提到JDK 1.7开始逐步“去永久代”的事情,在此就以测试代码观察一下这件事对程序的实际影响。

String

你可能感兴趣的:(面试,java)