字符串实习真的有用吗?
不久前,我曾就弦乐和各种语言进行过一次对话,弦乐实习的话题出现了。显然,Java和.NET框架会自动使用所有字符串以及几种脚本语言执行此操作。从理论上讲,它可以节省内存,因为您最终不会得到同一字符串的多个副本,并且可以节省时间,因为字符串相等性比较是一个简单的指针比较,而不是通过字符串的每个字符运行O(N)。
但是我越想越怀疑这个概念的好处。在我看来,这些优点主要是理论上的:
- 首先,要使用自动字符串插入,所有字符串都必须是不可变的,这使得许多字符串处理任务比需要的更难。(是的,我一般都听说过所有关于不变性的论点。这不是重点。
- 每次创建新字符串时,都必须根据字符串暂存表对其进行检查,这至少是一个 O(N) 操作。(编辑:其中N是字符串的大小,而不是表的大小,因为这会让人感到困惑。因此,除非字符串相等性比较与新字符串创建的比率非常高,否则节省的净时间不太可能是正值。
- 如果字符串相等性表使用强引用,则当不再需要字符串时,它们将永远不会被垃圾回收,从而浪费内存。另一方面,如果表使用弱引用,则字符串类需要某种终结器来从表中删除字符串,从而减慢了 GC 过程。(这可能非常重要,具体取决于字符串 intern 表的实现方式。最坏的情况是,在某些情况下,从哈希表中删除项目可能需要对整个表进行 O(N) 重建。
这只是我考虑实现细节的结果。我错过了什么吗?在一般情况下,字符串实习实际上是否提供了任何显着的好处?
编辑2:好吧,显然我是在一个错误的前提下运作的。与我交谈的人从未指出,对于新创建的字符串,字符串实习是可选的,实际上给人一种强烈的印象,即事实恰恰相反。感谢乔恩把事情弄清楚了。另一个被接受的答案。