使用java.lang.String.intern()是好的做法吗?

2022-08-31 06:24:04

关于 String.intern() 的 Javadoc 没有给出太多细节。(简而言之:它返回字符串的规范表示形式,允许使用==)

  • 我什么时候会使用这个函数来支持?String.equals()
  • 是否存在 Javadoc 中未提及的副作用,即 JIT 编译器或多或少地进行了优化?
  • 是否有进一步的用途?String.intern()

答案 1

这(几乎)与字符串比较无关。字符串暂存用于在应用程序中有许多内容相同的字符串时节省内存。通过使用应用程序,从长远来看,应用程序将只有一个实例,副作用是您可以执行快速引用相等性比较而不是普通的字符串比较(但这通常是不可取的,因为忘记只实习单个实例很容易中断)。String.intern()


答案 2

我什么时候会使用这个函数来支持String.equals()

当你需要速度时,因为你可以通过引用比较字符串(==比等于更快)

是否有 Javadoc 中未提及的副作用?

主要缺点是你必须记住确保你实际上做了intern()你要比较的所有字符串。很容易忘记intern()所有字符串,然后你可能会得到令人困惑的错误结果。另外,为了大家的缘故,请务必非常清楚地记录您依赖于被内化的字符串。

如果您决定内化字符串,第二个缺点是 intern() 方法相对昂贵。它必须管理唯一字符串池,以便完成相当多的工作(即使字符串已经内化)。因此,在代码设计中要小心,例如,intern()输入时所有适当的字符串,这样您就不必再担心它了。

(来自JGuru)

第三个缺点(仅限Java 7或更少):被拘禁的字符串存在于PermGen空间中,该空间通常很小;您可能会遇到一个具有大量可用堆空间的 OutOfMemoror。

(来自迈克尔·博格沃德)