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

时间:2017-05-25 09:58:26

标签: java jvm classloader string-pool

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

不要把句子“字符串池......由String类私有维护”太严重了。有时可能在池String类中存在用于池管理的字段,可能在Java 1.0中,但是很长一段时间,池只由JVM维护,而String.intern()是调用此工具的native方法。除了声明这个intern()方法之外,String类没有处理这个字符串池的任何内容。

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

答案 1 :(得分:0)

Java中的所有编译时常量 Strings 都会自动实现。(因此它们将被插入 StringTable String pool ))

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