Java Flyweight:字符串已使用字符串池:将字符串对象池用于Flyweight有意义吗?

Java Flyweight:字符串已使用字符串池:将字符串对象池用于Flyweight有意义吗?,java,performance,design-patterns,flyweight-pattern,Java,Performance,Design Patterns,Flyweight Pattern,字符串已使用Flyweight设计模式。共用字符串对象是否有益/有效。因为字符串已经从字符串池中提取出来了?字符串可以来自许多地方,默认情况下,字符串池中只有字符串文本。例如,当调用BufferedReader.readLine()时,它返回的字符串不在字符串池中 使用String.intern()或规范化映射将这些字符串集中在一起是否有意义,取决于您有多少重复,以及您可以为减少重复而节省多少内存 例如,如果您正在读取一个XML文件,规范化元素名称可能非常有用。如果您正在读取地址数据文件,规范化

字符串已使用Flyweight设计模式。共用字符串对象是否有益/有效。因为字符串已经从字符串池中提取出来了?

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

使用
String.intern()
或规范化映射将这些字符串集中在一起是否有意义,取决于您有多少重复,以及您可以为减少重复而节省多少内存


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

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