java - 如何将字符串添加到字符串池中

标签 java jvm classloader string-pool

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

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

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

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

最佳答案

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

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

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

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

如果您想实现自定义类加载器,您所要做的就是实现findClass并将格式正确的类文件传递给defineClass。如果您的类加载器具有非类资源的概念,您还可以实现 findResource[s] ,但是,这已经是最好的了。

关于java - 如何将字符串添加到字符串池中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44177594/

相关文章:

java - 卸载 rJava 和/或重新启动 JVM

java - JVM 如何处理字符串赋值?

在代码中执行 jar 时出现 java.lang.NoSuchMethodException

java - 从 Unsafe 创建的匿名类构建 ClassReader

java - 如何在 java 中找到匿名类的 GC 根?

Java:用于解析正负 double 的正则表达式

java.lang.IndexOutOfBoundsException

java - 在Java 8中,哪些数据移动到Java堆空间?

java - 为什么允许固定大小的数组支持的集合不实现所有接口(interface)方法?

java - 如何在 Java 中获得正确的 JTextField IP 地址?