intern
- 返回一个字符串常量池对象,如果池子已经存在,则直接返回,否则新建放入池子,并返回其引用
由于运行时常量池是方法区的一部分,所以这两个区域的溢出测试可以放到一起进行。
String::intern()是一个本地方法,它的作用是如果字符串常量池中包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象的引用,否则,会将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。
demo
package com.interview.demo.base;
/**
* @Author leijs
* @date 2022/3/31
*/
public class StringPoolDemo {
public static void main(String[] args) {
String str1 = new StringBuffer("ali").append("baba").toString();
System.out.println(str1);
System.out.println(str1.intern());
System.out.println(str1 == str1.intern());
System.out.println();
String str2 = new StringBuffer("ja").append("va").toString();
System.out.println(str2);
System.out.println(str2.intern());
System.out.println(str2 == str2.intern());
}
}
- 只有java是false,其他都是true
- false意味着是两个不同的java,另外一个java字符串如何加载进来的?
有一个初始化的java字符串(JDK出娘胎自带的)。在加载sun.misc.Version这个类的时候进入常量池。
源码递推
System代码解析
类加载器和rt.jar
根加载器提前部署加载rt.jar