真实生活,在Java中使用String.intern()的实际例子?

Tom*_*m N 24 java string permgen string-interning

我已经看到很多原始的例子描述了String intern()的工作方式,但我还没有看到一个可以从中受益的真实用例.

我能想到的唯一情况是拥有一个接收大量请求的Web服务,由于僵化的架构,每个请求都非常相似.通过intern()在这种情况下使用请求字段名称,可以显着减少内存消耗.

任何人都可以提供在生产环境中使用intern()并取得巨大成功的示例吗?也许是一个流行的开源产品中的一个例子?

编辑:我指的是手动实习,而不是字符串文字的保证实习等.

pol*_*nts 21

如果你有实习是非常有利的N,可以采取只字符串K,不同的价值,N远远超过K.现在,不是将N字符串存储在内存中,而是存储起来K.

例如,您可能有一个ID由5位数组成的类型.因此,只能有10^5不同的值.假设您现在正在解析一个包含许多引用/交叉引用ID值的大型文档.假设这个文件10^9总共有参考文献(显然在文件的其他部分重复了一些参考文献).

所以N = 10^9K = 10^5在这种情况下.如果你没有实习字符串,你将把10^9字符串存储在内存中,其中有很多字符串equals(通过Pigeonhole Principle).如果您在解析文档时得到intern()ID字符串,并且您没有保留对从文档中读取的未处理字符串的任何引用(因此它们可以被垃圾收集),那么您将永远不需要存储多个10^5字符串在记忆中.

  • 我相信这是一个接近完美的评估,感谢它抽象出多基因润滑剂.我提出一个有形的例子的困难在于,即使在上述情况下,您通常也可以对输入数据进行流式处理,然后以块为单位对所有数据进行处理.在远程源的情况下,假设网络延迟/影响可忽略不计,流式与内部()(如果适用)几乎总是更可取.事实上,我从来没有见过一个满足Strings阈值的用例来考虑intern(),但是不能流式传输并分裂和征服. (2认同)

And*_*s_D 1

不是一个完整的答案,但还有一些值得思考的地方(在这里找到):

因此,这种情况下的主要好处是,对内部化字符串使用运算符比使用方法[对于非内部化字符串]==要快得多。equals()因此,intern()如果您要比较字符串超过一三次,请使用该方法。

  • 答案是不正确的。String.equals 做的第一件事是在检查语义相等之前检查引用是否相等。因此,对于两个内部化字符串 == 和 .equals 来说,嗯,相等...... (2认同)