如何将字符串添加到字符串池
How to add a string to the string pool
当 class 由 bootstrap class 加载程序从 class 文件加载时,它会将常量池中包含的字符串添加到字符串池中。
但是,如果我构建自己的 class 加载程序怎么办?如何请求将字符串文字添加到字符串池中?
我认为 String.intern()
无法回答我的问题,因为要这样做,您已经需要一个字符串。
补充问题:谁负责字符串池?我可以在 http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#intern%28%29 读到 class 字符串有一个字符串池:是同一个吗?是静态字段吗?
Java 中的所有编译时常量 Strings 都会自动驻留。(因此它们将被插入到 StringTable (字符串池))
希望对您有所帮助。
有关我博客上字符串实习的更多信息:http://www.zoltanraffai.com/blog/?p=74
字符串池的管理是 JVM 的一部分,绝不会由 class 加载程序触发。编译时常量到池化运行时字符串实例的映射也不能通过 intern()
工作。每次都构造一个新的 String
实例,只是为了通过 intern()
.
找到一个已经存在的实例,效率非常低下
调用 intern()
可以将额外的实例添加到 JVM 池中,但对于已经自动添加到 JVM 池中的字符串则不需要。
JVM 不仅将 class' 常量池的条目映射到运行时字符串池,而且由 JVM 决定何时执行此操作。对于 HotSpot,它不会在加载时创建和添加 String
个实例,而是在它们第一次使用时创建和添加。
不要把“字符串池……由 class 字符串私下维护”这句话看得太严重。可能曾经在 String
class 中确实存在用于池管理的字段,也许在 Java 1.0 中,但很长一段时间以来,池完全由JVM 和 String.intern()
是一个 native
方法回调到这个设施。除了这个 intern()
方法的声明之外,String
class 没有任何处理这个字符串池的东西。
如果你想实现自定义 class 加载器,你所要做的就是实现 findClass
并将格式良好的 class 文件传递给 defineClass
。如果您的 class 加载程序具有非 class 资源的概念,您可以另外实现 findResource[s]
,但是,这已经是可有可无的一面了。
当 class 由 bootstrap class 加载程序从 class 文件加载时,它会将常量池中包含的字符串添加到字符串池中。
但是,如果我构建自己的 class 加载程序怎么办?如何请求将字符串文字添加到字符串池中?
我认为 String.intern()
无法回答我的问题,因为要这样做,您已经需要一个字符串。
补充问题:谁负责字符串池?我可以在 http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#intern%28%29 读到 class 字符串有一个字符串池:是同一个吗?是静态字段吗?
Java 中的所有编译时常量 Strings 都会自动驻留。(因此它们将被插入到 StringTable (字符串池))
希望对您有所帮助。 有关我博客上字符串实习的更多信息:http://www.zoltanraffai.com/blog/?p=74
字符串池的管理是 JVM 的一部分,绝不会由 class 加载程序触发。编译时常量到池化运行时字符串实例的映射也不能通过 intern()
工作。每次都构造一个新的 String
实例,只是为了通过 intern()
.
调用 intern()
可以将额外的实例添加到 JVM 池中,但对于已经自动添加到 JVM 池中的字符串则不需要。
JVM 不仅将 class' 常量池的条目映射到运行时字符串池,而且由 JVM 决定何时执行此操作。对于 HotSpot,它不会在加载时创建和添加 String
个实例,而是在它们第一次使用时创建和添加。
不要把“字符串池……由 class 字符串私下维护”这句话看得太严重。可能曾经在 String
class 中确实存在用于池管理的字段,也许在 Java 1.0 中,但很长一段时间以来,池完全由JVM 和 String.intern()
是一个 native
方法回调到这个设施。除了这个 intern()
方法的声明之外,String
class 没有任何处理这个字符串池的东西。
如果你想实现自定义 class 加载器,你所要做的就是实现 findClass
并将格式良好的 class 文件传递给 defineClass
。如果您的 class 加载程序具有非 class 资源的概念,您可以另外实现 findResource[s]
,但是,这已经是可有可无的一面了。