字符串已经在使用Flyweight设计模式。汇集常见的String对象是否有益/高效。因为字符串已经从字符串池中拉出来了吗?
答案 0 :(得分:7)
字符串可以来自很多地方,默认情况下,只有字符串文字在字符串池中。例如,当您调用BufferedReader.readLine()
时,它返回的字符串不在字符串池中。
使用String.intern()
或规范化地图汇集这些字符串是否有意义取决于您拥有多少重复,以及您可以节省多少内存来减少重复。
例如,如果您正在读取XML文件,那么规范化元素名称可能非常有用。如果您正在读取地址数据文件,则规范化邮政编码和/或城市名称可能会有用。但是,在这两种情况下,我都会考虑使用Map
而不是调用intern()
,因为后者会消耗permgen内存(这是一种比普通堆内存更稀缺的资源)。
答案 1 :(得分:3)
如果没有关于你的系统的任何其他信息,我会说创建一个特定目的的字符串池将属于过早的优化类别。如果您的系统确实是非常严重的字符串操作,并且分析显示String对象是主要垃圾收集发生的原因,那么我建议将StringBuilder作为替代,并深入理解使用字符串的最佳实践,而不是为他们创建缓存。