почему '==' возвращает false, даже если значение моего хеш-кода одинаково
481 просмотра
3 ответа
Я написал класс, как
public class HashCodeImpl{
public int hashCode(){
return 1;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
HashCodeUtil h= new HashCodeUtil();
HashCodeUtil h1= new HashCodeUtil();
System.out.println(h.hashCode());
System.out.println(h1.hashCode());
System.out.println(h);
System.out.println(h1);
System.out.println(h==h1);
}
}
Выход:
1
com.manu.test.HashCodeUtil@1
com.manu.test.HashCodeUtil@1 false
Мой вопрос: когда мой метод hashCode возвращает то же значение, то почему
System.out.println(h==h1);
возвращается false?
Пожалуйста, объясни.
Автор: Katiyman Источник Размещён: 13.11.2019 11:34Ответы (3)
1 плюс
Потому что это две разные ссылки на объекты. ==
сравните ссылки, а не hashCode
результаты.
Чтобы получить желаемый результат, вы можете переопределить equals
метод в своем классе и использовать, h1.equals(h2)
чтобы увидеть, эквивалентны ли они. Здесь вы можете использовать результат, hashCode
чтобы упростить оценку равенства сравниваемых объектов (это не означает, что два объекта с одинаковым хеш-кодом равны).
Но обратите внимание, что даже если объекты имеют одинаковые значения hashCode
и являются эквивалентными по определению equals
метода, они являются разными ссылками, которые занимают другое место в куче.
0 плюса
Как указывает @ZouZou, hashCode
равенство не означает равенство объектов. Сказав это, вы даже не сравниваете предметное равенство. Сравнение двух объектов ==
- это проверка на равенство ссылок, которую вы почти никогда не должны использовать, если только вы действительно не знаете, что делаете.
0 плюса
Вы неправильно понимаете цель hashCode
. Как уже отмечали другие, ==
сравниваются ссылки, а не хэш-коды. Однако переопределяющий equals
метод, который сравнивает значения, а не ссылки, все равно не будет сравнивать хеш-коды.
Подумайте об этом ... Хеш-код является хэш-кодом int
, поэтому существует только 2 32 возможных значения. Но сколько есть возможных String
? Много, много больше 2 32 . (Поскольку у каждого char
есть 2 16 возможных значений, существует 2 48 возможных String
s длины три, и число увеличивается с увеличением длины String
s.) Следовательно, невозможно создать схему, в которой два String
s всегда равны, если их хэш-коды равны. То же самое верно для большинства других объектов (хотя класс с относительно небольшим числом возможных значений может быть установлен с уникальным хеш-кодом для каждого значения).
В hashCode
цели «S грядет с номером , который может быть использован для hashMap
или hashSet
. Мы часто пытаемся придумать функцию, которая уменьшит вероятность того, что неравные объекты имеют неравные хеш-коды, чтобы повысить эффективность карты или набора. Но для большинства объектов это невозможно гарантировать.
Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- object Вызов функции модуля с использованием его имени (строки)
- object Создайте базовый итератор Python
- object Обнаружение неопределенного свойства объекта
- object Каков наиболее эффективный способ глубокого клонирования объекта в JavaScript?
- hash Есть ли какая-либо функция хэш-кода в JavaScript?
- hash Есть ли фиксированная точка MD5, где md5 (x) == x?
- hash Какой тип данных использовать для поля хешированного пароля и какой длины?
- hash Почему Java hashCode () в String использует 31 в качестве множителя?
- reference Каковы различия между переменной-указателем и ссылочной переменной в C ++?
- reference Есть ли разница между "==" и "есть"?
- reference Определение манифеста обнаруженной сборки не соответствует ссылке на сборку
- reference Есть ли ошибки, использующие varargs с опорными параметрами
- hashcode Какие проблемы следует учитывать при переопределении equals и hashCode в Java?
- hashcode Как определить равенство для двух объектов JavaScript?
- hashcode Каков наилучший алгоритм для переопределенного System.Object.GetHashCode?