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

The*_*Hat 5 java performance design-patterns flyweight-pattern

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

小智 7

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

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

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


Eug*_*gen 3

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