1. ホーム
  2. java

[解決済み] java.lang.String.intern()を使用するのは良い習慣ですか?

2022-04-18 07:52:45

質問

に関するJavadoc String.intern() は、あまり詳しいことは書いていない。(一言で言えば これは文字列の正規表現を返すもので、内部で使われている文字列を == )

  • この関数はどのような場合に使用するのでしょうか? String.equals() ?
  • Javadocに記載されていない副作用、つまりJITコンパイラによる最適化の多寡はありますか?
  • をさらに利用することはできますか? String.intern() ?

解決方法は?

<ブロッククオート

String.equals()の代わりにこの関数を使用するのはどのような場合でしょうか?

が必要なとき スピード 文字列を参照で比較できるため(==はequalsより高速です)

<ブロッククオート

Javadocに記載されていない副作用があるのでしょうか?

主な欠点は、比較するすべての文字列を実際にintern()することを忘れないようにしなければならないことです。すべての文字列をintern()することを忘れると、混乱するほど不正確な結果を得ることになりがちです。また、みんなのために、文字列が内部化されていることに依存していることを明確に文書化しておいてください。

文字列を内部化する場合の2つ目の欠点は、intern()メソッドが比較的高価であることです。文字列がすでに内部化されている場合でも)一意の文字列のプールを管理する必要があるため、かなりの量の作業を行うことになります。ですから、例えば、入力された文字列のうち適切なものをすべてintern()するように、コード設計に気をつけるとよいでしょう。

(JGuruより)

第三の欠点(Java 7以下のみ):インターンされたStringはPermGen空間に存在し、それは通常非常に小さいです;ヒープに十分な空き領域があるのにOutOfMemoryErrorに遭遇することがあるかもしれません。

(Michael Borgwardtより)