Почему '==' возвращает 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с длиной три, и число продолжает расти, чем дольше Strings получить.) Таким образом, невозможно создать схему, в которой два Strings всегда равны, если их хэш-коды равны. То же самое верно для большинства других объектов (хотя класс с относительно небольшим числом возможных значений может быть установлен с уникальным хеш-кодом для каждого значения).

hashCodeЦель состоит в том, чтобы придумать номер, который может быть использован для hashMap или же hashSet, Мы часто пытаемся придумать функцию, которая уменьшит вероятность того, что неравные объекты имеют неравные хеш-коды, чтобы повысить эффективность карты или набора. Но для большинства объектов это невозможно гарантировать.

Другие вопросы по тегам