Flyweight:字符串已经使用字符串池:为Flyweight池化String对象是否有意义?

时间:2011-03-31 19:00:13

标签: java performance design-patterns flyweight-pattern

字符串已经在使用Flyweight设计模式。汇集常见的String对象是否有益/高效。因为字符串已经从字符串池中拉出来了吗?

2 个答案:

答案 0 :(得分:7)

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

使用String.intern()或规范化地图汇集这些字符串是否有意义取决于您拥有多少重复,以及您可以节省多少内存来减少重复。

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

答案 1 :(得分:3)

如果没有关于你的系统的任何其他信息,我会说创建一个特定目的的字符串池将属于过早的优化类别。如果您的系统确实是非常严重的字符串操作,并且分析显示String对象是主要垃圾收集发生的原因,那么我建议将StringBuilder作为替代,并深入理解使用字符串的最佳实践,而不是为他们创建缓存。