字符串池的管理是 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]
如果你的类加载器有一个非类资源的概念,你可以另外实现,但是,这已经很好了。