intern

1648697178(1).png

  • 返回一个字符串常量池对象,如果池子已经存在,则直接返回,否则新建放入池子,并返回其引用

由于运行时常量池是方法区的一部分,所以这两个区域的溢出测试可以放到一起进行。
String::intern()是一个本地方法,它的作用是如果字符串常量池中包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象的引用,否则,会将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。

demo

  1. package com.interview.demo.base;
  2. /**
  3. * @Author leijs
  4. * @date 2022/3/31
  5. */
  6. public class StringPoolDemo {
  7. public static void main(String[] args) {
  8. String str1 = new StringBuffer("ali").append("baba").toString();
  9. System.out.println(str1);
  10. System.out.println(str1.intern());
  11. System.out.println(str1 == str1.intern());
  12. System.out.println();
  13. String str2 = new StringBuffer("ja").append("va").toString();
  14. System.out.println(str2);
  15. System.out.println(str2.intern());
  16. System.out.println(str2 == str2.intern());
  17. }
  18. }

1648697590(1).png

  • 只有java是false,其他都是true
  • false意味着是两个不同的java,另外一个java字符串如何加载进来的?

    有一个初始化的java字符串(JDK出娘胎自带的)。在加载sun.misc.Version这个类的时候进入常量池。

源码递推

System代码解析

image.png
image.png

类加载器和rt.jar

根加载器提前部署加载rt.jar