lamerizhottabicha
@lamerizhottabicha
Начинающий программист Java и дизайнер

Почему у строк всегда одиноковый hashcode()?

String str1 = "Hello";
String str2 = "Hello";

Два объекта String с разными ссылками.

Тоже самое, что например:
Ob ob1 = new Ob("Object", 1);
Ob ob2 = new Ob("Object", 1);


Те же самые два объекта с разными ссылками, но у них будет разный hashcode() в отличии от String

Вопрос: почему?
  • Вопрос задан
  • 360 просмотров
Решения вопроса 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день.
Вот, ответ на ваш вопрос:
https://www.baeldung.com/java-string-immutable
Why_String_Is_Immutable_In_Java.jpg
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
String str1 = "Hello";
String str2 = "Hello";

Тут одна и та же ссылка. Но даже если сделать их разными объектами, всё будет аналогично.

Начнём с того, что такое хэш-код. Если объекты равны, их хэш-коды гарантированно равны. Если не равны — то хэш коды, скорее всего (но не обязательно!) не равны. А теперь — о том, что такое «равные объекты».

Изначально равенство объектов проверяется просто: никакие два объекта не равны, объект равен самому себе и никому больше. В таком случае естественно каким-то образом построить хэш-код из адреса.Для строк это не так, и функция hashCode() переписана, чтобы учитывала данные внутри, а не адрес.

(Почему говорю «каким-то образом» — при определённом устройстве хэш-таблицы, если брать просто адрес, часть гнёзд будут простаивать. Так что устройство хэш-функции и хэш-таблицы надо согласовать, чтобы таблица заполнялась равномерно.)
Ответ написан
vabka
@vabka
Токсичный шарпист
Потому:
1. Вообще-то одинаковые ссылки у них, тк во время компиляции все строковые литералы превращаются в константы.
2. Это нужно, чтобы можно было нормально использовать строки в качестве ключей в мапе.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы