Вероятно, чтобы ускорить вычисления hashCode()
, но, как следствие, у него было больше потенциальных коллизий.
Новая версия предпочитает меньше коллизий, но требует большего количества вычислений.
Но на самом деле String
s являются неизменяемыми, поэтому в более поздних версиях hashCode()
это вычисляется один раз:
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
hash = h = isLatin1() ? StringLatin1.hashCode(value)
: StringUTF16.hashCode(value);
}
return h;
}
Так что в некотором смысле это имеет смыслпредпочтение этому способу, так как оно уменьшает число столкновений и не пропускает некоторые символы в вычислениях hashCode()
, не так уж и дорого, поскольку результат кэшируется.