轻量级模式:字符串已经使用了字符串池,对于轻量级模式来说,池化字符串对象是否有意义?

5

字符串已经使用了享元设计模式。如果将常见的字符串对象放入池中,是否会有益于性能?因为这些字符串已经从字符串池中提取出来了。

2个回答

7

字符串可以来自多个地方,默认情况下只有字符串字面量在字符串池中。例如,当您调用BufferedReader.readLine()时,它返回的字符串不在字符串池中。

是否值得对这些字符串进行池化,使用String.intern()或规范化映射,取决于您有多少重复内容以及您可以节省多少内存来减少该重复内容。

例如,如果您正在读取XML文件,则规范化元素名称可能非常有用。如果您正在读取地址数据文件,则规范化邮政编码和/或城市名称可能很有用。但是,在这两种情况下,我会考虑使用Map而不是调用intern(),因为后者会消耗PermGen内存(这比普通堆内存更加稀缺)。


3

如果没有关于您系统的其他信息,我会说创建特定目的的字符串池属于过早优化范畴。如果您的系统确实非常依赖字符串操作,并且分析显示字符串对象是主要垃圾收集发生的原因,那么我建议考虑使用StringBuilder进行替换,并深入了解与字符串相关的最佳实践,而不是为它们创建缓存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接