String.intern()
メソッドがJavaでどのように実装されているかを調べるために、少し調査を行いました。
Open JDK 6 の Intern プールの C++ 実装を調べたところ、単純なHashSet
. 私にとっては、誰かがインターンをしようとしているときにString
、次のステップを実行する必要があることを意味しました。
- 指定されたハッシュコードを見つける
String
- 適切なバケットを見つける
- 指定された文字列をバケット内の他のすべての文字列と比較します。このステップの前に、バケット内に 0 個の文字列、1 個の文字列、または多数の文字列が存在する可能性があります。したがって、指定された文字列が以前にバケットに入れられている場合、少なくとも 1 つの比較が行われます (これが最良のケースです。もちろん、多くの衝突があった可能性があり、他の多くの文字列がバケットに含まれています)。
- String がバケットで見つかった場合は、
intern()
メソッドによって返される必要があります - 文字列がバケットに見つからない場合は、バケットに入れ、
intern()
メソッドによって返す必要があります
str1.intern() == str2.intern()
非常に多くの人が、それは よりも速いと言っていstr1.equals(str2)
ます。
しかし、それが速くなる理由がわかりません。
ご覧のとおりstr1.equals(str2)
、メソッドで char ごとに比較する 2 つの文字列が常に存在しますString.equals()
。
の場合str1.intern() == str2.intern()
、プールとの間で文字列を取得または格納するために必要な比較の数は?
そのため、文字列を比較str1.intern() == str2.intern()
するために使用する場合でも、==
前述の比較など、多くの追加アクションがあります。
それを理解したとき、ベンチマークテストを行うことにしました。
最初の結果は、str1.intern() == str2.intern()
が よりも速いことを示していましたstr1.equals(str2)
。
この動作は、String.intern()
メソッドがネイティブであるため、毎回解釈されるべきではなくString.equals()
、Java メソッドであることが原因でした。
そこで、-Xcomp
オプションを使用して、JVM が開始時にすべてのコードをコンパイルするようにすることにしました。
その後はインターン以上の速さを見せた。
Java 6 および 7 でテストしました。
私の質問は、文字列比較の高速化をインターンするときに状況を見たことがありますか? はい、どうしてですか?
それともintern()
、より多くの空きメモリを節約するのに役立つのでしょうか?