Потому что String
переопределяетObject.hashCode()
пока ваш класс не делает.
Это означает, что класс String
имеет конкретную реализацию hashCode()
, которая рассчитает хэш на основе значения String
. Таким образом, для двух строк с одинаковым значением хэш-код будет таким же.
Если вы создаете новый класс A
, например, если вы не предоставили свою собственную реализацию для hashCode()
, она будет использовать реализацию по умолчанию из класса Object
. Реализация по умолчанию может гарантировать только то, что хэш-коды будут одинаковыми, если они будут получены от точно таким же экземпляром.
Методы Objects.hash()
(для нескольких значений) и Objects.hashCode()
(для одного значения) упрощают реализацию hashCode()
в ваших собственных классах. Например:
class A{
int a;
A() {
this.a = 100;
}
@Override
public int hashCode() {
return Objects.hashCode(a);
}
}
Обратите внимание, что если значения атрибутов, используемых для создания изменения хэш в какой-то момент, результат hashCode()
, вероятно, тоже изменится.
str0 и str1 указывают на то же ссылки в StringPool, в то время как «а» и «б» указывают на различные ссылки в поскольку используется ключевое слово 'new'. –
Это не имеет никакого отношения к String interning. – Crazyjavahacking
@Crazyjavahacking Он делает. Даже если 'String' * не * переопределяет' hashCode', OP получит тот же результат, потому что 'str1' и' str2' являются ссылками на один и тот же объект, тогда как 'a' и' b' не являются. –