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

How to add a string to the string pool

当 class 由 bootstrap class 加载程序从 class 文件加载时,它会将常量池中包含的字符串添加到字符串池中。

但是,如果我构建自己的 class 加载程序怎么办?如何请求将字符串文字添加到字符串池中?

我认为 String.intern() 无法回答我的问题,因为要这样做,您已经需要一个字符串。

补充问题:谁负责字符串池?我可以在 http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#intern%28%29 读到 class 字符串有一个字符串池:是同一个吗?是静态字段吗?

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

希望对您有所帮助。 有关我博客上字符串实习的更多信息:http://www.zoltanraffai.com/blog/?p=74

字符串池的管理是 JVM 的一部分,绝不会由 class 加载程序触发。编译时常量到池化运行时字符串实例的映射也不能通过 intern() 工作。每次都构造一个新的 String 实例,只是为了通过 intern().

找到一个已经存在的实例,效率非常低下

调用 intern() 可以将额外的实例添加到 JVM 池中,但对于已经自动添加到 JVM 池中的字符串则不需要。

JVM 不仅将 class' 常量池的条目映射到运行时字符串池,而且由 JVM 决定何时执行此操作。对于 HotSpot,它不会在加载时创建和添加 String 个实例,而是在它们第一次使用时创建和添加。

不要把“字符串池……由 class 字符串私下维护”这句话看得太严重。可能曾经在 String class 中确实存在用于池管理的字段,也许在 Java 1.0 中,但很长一段时间以来,池完全由JVM 和 String.intern() 是一个 native 方法回调到这个设施。除了这个 intern() 方法的声明之外,String class 没有任何处理这个字符串池的东西。

如果你想实现自定义 class 加载器,你所要做的就是实现 findClass 并将格式良好的 class 文件传递​​给 defineClass。如果您的 class 加载程序具有非 class 资源的概念,您可以另外实现 findResource[s],但是,这已经是可有可无的一面了。