当引导类加载器从类文件加载类时,它会在字符串池中添加其常量池中包含的字符串。
但是,如果我构建自己的类加载器怎么办?如何要求将字符串文字添加到字符串池中?
我不认为String.intern()回答了我的问题,因为这样做,你已经需要一个String。
补充问题:谁来照顾字符串池?我可以在http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#intern%28%29读到类String有一个字符串池:它是同一个吗?它是静态场吗?
答案 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