1

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

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

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

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

4

2 回答 2

2

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

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

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

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

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

于 2017-11-23T17:26:59.340 回答
0

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

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

于 2017-06-06T20:06:49.747 回答