Java 如何将字符串添加到字符串池

Java 如何将字符串添加到字符串池,java,jvm,classloader,string-pool,Java,Jvm,Classloader,String Pool,当引导类加载器从类文件加载类时,它会将常量池中包含的字符串添加到字符串池中 但是,如果我构建自己的类加载器呢?如何要求向字符串池中添加字符串文字 我不认为String.intern()回答了我的问题,因为要这样做,你已经需要一个字符串了 补充问题:谁负责弦乐池?我可以读到类字符串有一个字符串池:是同一个吗?它是一个静态字段吗?Java中的所有编译时常量字符串都被自动插入(因此它们将被插入StringTable(字符串池)) 希望对你有帮助。 关于字符串实习的更多信息,请访问我的博客:字符串池的管

当引导类加载器从类文件加载类时,它会将常量池中包含的字符串添加到字符串池中

但是,如果我构建自己的类加载器呢?如何要求向字符串池中添加字符串文字

我不认为
String.intern()
回答了我的问题,因为要这样做,你已经需要一个字符串了


补充问题:谁负责弦乐池?我可以读到类字符串有一个字符串池:是同一个吗?它是一个静态字段吗?

Java中的所有编译时常量字符串都被自动插入(因此它们将被插入StringTable(字符串池))

希望对你有帮助。
关于字符串实习的更多信息,请访问我的博客:

字符串池的管理是JVM的一部分,绝不会由类加载器触发。编译时常量到池运行时字符串实例的映射也不能通过
intern()
工作。每次构造一个新的
String
实例,只是通过
intern()
查找一个已经存在的实例,效率会非常低

调用
intern()

JVM不仅将类的常量池的条目映射到运行时字符串池,还由JVM决定何时进行映射。对于HotSpot,它不会在加载时创建和添加
String
实例,而是在第一次使用时创建和添加

不要把“一组字符串……由类字符串私下维护”这句话看得太严重。也许在Java 1.0中,
String
类中确实存在用于池管理的字段,但很长一段时间以来,池完全由JVM维护,
String.intern()
是一种调用此工具的
本机
方法。除了这个
intern()
方法的声明之外,
String
类没有处理这个字符串池的内容


如果要实现自定义类加载器,只需实现
findClass
,并将格式良好的类文件传递给
defineClass
。如果你的类加载器有一个非类资源的概念,那么你可以另外实现
findResource[s]
,但是,这已经很好了。

对于放“-1”的人:如果你认为这不是一个好问题,请给出一个注释。编译器不能内部化字符串(它只是将它们添加到常量池中),JVM确实如此。我的问题不是关于硬编码字符串,而是关于动态创建的引用字符串的类。我认为
String.intern()
实际上就是答案,字符串池就是
String
的字符串池。如果动态创建的类的字节码包含字符串,它们将自动添加到字符串池中。