Почему '==' возвращает false, даже если значение моего хеш-кода одинаково
Я написал класс, как
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);
становится ложным?
Пожалуйста, объясни.
3 ответа
Потому что это две разные ссылки на объекты. ==
сравните ссылки, а не hashCode
Результаты.
Чтобы получить желаемый результат, вы можете переопределить equals
метод в вашем классе и использовать h1.equals(h2)
чтобы увидеть, если они эквивалентны. Здесь вы можете использовать результат hashCode
упростить оценку равенства сравниваемых объектов (это не означает, что два объекта с одинаковым хеш-кодом равны).
Но обратите внимание, что даже если объекты имеют одинаковые hashCode
и эквивалентны по определению equals
Метод, они разные ссылки, которые занимают другое место в куче.
Как отмечает @ZouZou, hashCode
равенство не равняется объектному равенству. Сказав это, вы даже не сравниваете предметное равенство. Сравнивая два объекта с ==
это проверка на равенство ссылок, которую вы почти никогда не должны использовать, если только вы действительно не знаете, что делаете.
Вы неправильно понимаете цель hashCode
, Как уже отмечали другие, ==
сравнивает ссылки, а не хеш-коды. Тем не менее, наиважнейшим equals
метод, который сравнивает значения, а не ссылки, все равно не будет сравнивать хеш-коды.
Подумай об этом... Хеш-код int
и, следовательно, для хеш-кода есть только 232 возможных значения. Но сколько можно String
с там есть? Много, много больше 232. (Так как каждый char
имеет 216 возможных значений, 248 возможных String
с длиной три, и число продолжает расти, чем дольше String
s получить.) Таким образом, невозможно создать схему, в которой два String
s всегда равны, если их хэш-коды равны. То же самое верно для большинства других объектов (хотя класс с относительно небольшим числом возможных значений может быть установлен с уникальным хеш-кодом для каждого значения).
hashCode
Цель состоит в том, чтобы придумать номер, который может быть использован для hashMap
или же hashSet
, Мы часто пытаемся придумать функцию, которая уменьшит вероятность того, что неравные объекты имеют неравные хеш-коды, чтобы повысить эффективность карты или набора. Но для большинства объектов это невозможно гарантировать.