使用java.lang.String.intern()是好的做法吗?
关于 String.intern() 的
Javadoc 没有给出太多细节。(简而言之:它返回字符串的规范表示形式,允许使用==
)
- 我什么时候会使用这个函数来支持?
String.equals()
- 是否存在 Javadoc 中未提及的副作用,即 JIT 编译器或多或少地进行了优化?
- 是否有进一步的用途?
String.intern()
关于 String.intern() 的
Javadoc 没有给出太多细节。(简而言之:它返回字符串的规范表示形式,允许使用==
)
String.equals()
String.intern()
这(几乎)与字符串比较无关。字符串暂存用于在应用程序中有许多内容相同的字符串时节省内存。通过使用应用程序,从长远来看,应用程序将只有一个实例,副作用是您可以执行快速引用相等性比较而不是普通的字符串比较(但这通常是不可取的,因为忘记只实习单个实例很容易中断)。String.intern()
我什么时候会使用这个函数来支持String.equals()
当你需要速度时,因为你可以通过引用比较字符串(==比等于更快)
是否有 Javadoc 中未提及的副作用?
主要缺点是你必须记住确保你实际上做了intern()你要比较的所有字符串。很容易忘记intern()所有字符串,然后你可能会得到令人困惑的错误结果。另外,为了大家的缘故,请务必非常清楚地记录您依赖于被内化的字符串。
如果您决定内化字符串,第二个缺点是 intern() 方法相对昂贵。它必须管理唯一字符串池,以便完成相当多的工作(即使字符串已经内化)。因此,在代码设计中要小心,例如,intern()输入时所有适当的字符串,这样您就不必再担心它了。
(来自JGuru)
第三个缺点(仅限Java 7或更少):被拘禁的字符串存在于PermGen空间中,该空间通常很小;您可能会遇到一个具有大量可用堆空间的 OutOfMemoror。
(来自迈克尔·博格沃德)