不変クラス String の場合。String :: hashCode
計算は、そのオブジェクトの存続期間中に 1 回だけ行われます。したがってhashCode()
、最初の呼び出しの後に呼び出すと、常に単に返されprivate int hash
ます。計算に CPU が浪費されることはありません。
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) { // **h != 0 in second time**
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
ハッシュコードとイコールの間の契約を知っているように
equal objects must produce the same hash code
したがって、以下のコードにより、文字列 equals() のパフォーマンスが向上すると思います。ハッシュマップはすでにハッシュコードに基づいてバケットを取得しているため、これはハッシュマップでは冗長である可能性がありますが、これにより BIG リスト検索のパフォーマンスが向上します。
//Does the below will improve equals performance on BIG LIST?
if (this.hashCode() != anObject.hashCode()) {
return false;
}
以下のAPIにあなたの考えをコメントしてください。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (this.hashCode() != anObject.hashCode()) {
return false;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
アップデート
「dasblinkenlight」で述べたように、hashcode() API が最初に呼び出されたときにのみ必要な CPU サイクルがいくつかあります。
Java は String Pool を維持しているため。アプリケーションがハッシュ時以外に大きな文字列を複数回比較する必要がある場合。次に、以下のように Utility メソッドに進みます。
public boolean StringCompare (String one, String two) {
if (one == two) {
return true;
}
if (one.hashCode() != two.hashCode()) {
return false;
}
int n = one.count;
if (n == two.count) {
char v1[] = one.value;
char v2[] = two.value;
int i = one.offset;
int j = two.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}