String исходный код :
Хеш-код:
/** Cache the hash code for the string */
private int hash; // Default to 0
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31 * h + val[off++];
}
hash = h;
}
return h;
}
Код равенства:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
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;
}
Таким образом, каждый из них включает в себя один цикл для всех символов в строке, хеш вычисляется только один раз для каждой строки, но в отличие от цикла вычисления хеша, цикл равенства получает преимущественный выход при первом несовпадении символов, и более того, цикл равенства даже не происходит, если строки имеют разную длину.
Мое интуитивное чувство таково, что если вы не сравниваете одни и те же строки с одними и теми же строками снова и снова, равны выигрыши.
Жесткий вызов. Сделайте тест, если вы действительно хотите знать, какой из них быстрее для вашего приложения.