Почему существует другая ситуация, когда хэш-код ключа имеет три ситуации больше или меньше или равно?

Я, наконец, решил его, установив плагин вручную через CLI (я изначально установил его через NativeScript sidekick), видимо, они не учли тот факт, что некоторым плагинам могут потребоваться некоторые пользовательские входы, чтобы написать конкретный файл конфигурации (который nativescript -plugin-firebase), поэтому, установив его вручную, я должен был предоставить пользователю необходимый вход, он настроен, и он сработал!

3
задан Jon Skeet 19 January 2019 в 09:13
поделиться

2 ответа

Какова ситуация, когда hashCode двух объектов равен друг другу, но == и equals () получат значение false?

Согласно документации Java:

[ 1112]
  • Если объекты равны (т. Е. x.equals(y) == true), то hashCode этих объектов также должны быть равны (т. Е. x.hashCode() == y.hashCode())
  • Если два объекта равны hashCode (т. Е. [ 114]), то не обязательно, чтобы эти объекты были равны (т. Е. x.equals(y) == true/false)
  • 0
    ответ дан PranshuKhandal 19 January 2019 в 09:13
    поделиться

    Какова ситуация, когда hashCode двух объектов равен друг другу, но == и equals () получат false?

    Когда происходит коллизия хеш-кода.

    Пример

    Рассмотрим эти два длинных:

    Long l1 = 1L;
    Long l2 = 4294967296L; //which is 2 ^ 32
    

    Согласны ли вы с тем, что они различны и equals() вернет false? Однако результат

    l1.hashCode() == l2.hashCode()
    

    верен.

    Почему? Посмотрите на реализацию hashCode для Long:

    public static int hashCode(long value) {
        return (int)(value ^ (value >>> 32));
    }
    

    Поскольку long может иметь значения 2 ^ 64, а возвращаемое значение hashcode - int, которое может иметь значения 2 ^ 32, это нормально, что у вас есть коллизии (каждое значение создает коллизии с 2 ^ 32 другими значениями).


    Уточнения

    Но я слышал, что переопределение equals () тоже должно переопределять hashCode (), поэтому с этим вопросом не будет.

    Да, когда вы переопределяете equals(), вы должны переопределить также hashCode(). Это правда, но я думаю, что вы перепутали последствия. Из javadoc хеш-кода :

    Если два объекта равны в соответствии с методом equals (Object), то вызов метода hashCode для каждого из двух объектов должен привести к одному и тому же целочисленный результат.

    Не требуется, чтобы, если два объекта были неравны в соответствии с методом equals (java.lang.Object), то вызов метода hashCode для каждого из этих двух объектов должен давать разные целочисленные результаты. Тем не менее, программист должен знать, что выдача различных целочисленных результатов для неравных объектов может повысить производительность хеш-таблиц.

    Таким образом, импликация

    a.equals(b) => a.hashCode() == b.hashCode()
    

    должна быть всегда истинной (если ваши методы реализованы правильно), но обратное значение

    a.hashCode() == b.hashCode() => a.equals(b)
    

    не обязательно имеет к.

    0
    ответ дан Ricola 19 January 2019 в 09:13
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: