Я, наконец, решил его, установив плагин вручную через CLI (я изначально установил его через NativeScript sidekick), видимо, они не учли тот факт, что некоторым плагинам могут потребоваться некоторые пользовательские входы, чтобы написать конкретный файл конфигурации (который nativescript -plugin-firebase), поэтому, установив его вручную, я должен был предоставить пользователю необходимый вход, он настроен, и он сработал!
Какова ситуация, когда hashCode двух объектов равен друг другу, но == и equals () получат значение false?
blockquote>Согласно документации Java:
[ 1112]Если объекты равны (т. Е. x.equals(y) == true
), тоhashCode
этих объектов также должны быть равны (т. Е.x.hashCode() == y.hashCode()
)Если два объекта равны hashCode
(т. Е. [ 114]), то не обязательно, чтобы эти объекты были равны (т. Е.x.equals(y) == true/false
)
См. Подробности в Oracle Java Tutorial: Object as Superclass
Какова ситуация, когда hashCode двух объектов равен друг другу, но == и equals () получат false?
blockquote>Когда происходит коллизия хеш-кода.
Пример
Рассмотрим эти два длинных:
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 (), поэтому с этим вопросом не будет.
blockquote>Да, когда вы переопределяете
equals()
, вы должны переопределить такжеhashCode()
. Это правда, но я думаю, что вы перепутали последствия. Из javadoc хеш-кода :Если два объекта равны в соответствии с методом equals (Object), то вызов метода hashCode для каждого из двух объектов должен привести к одному и тому же целочисленный результат.
Не требуется, чтобы, если два объекта были неравны в соответствии с методом equals (java.lang.Object), то вызов метода hashCode для каждого из этих двух объектов должен давать разные целочисленные результаты. Тем не менее, программист должен знать, что выдача различных целочисленных результатов для неравных объектов может повысить производительность хеш-таблиц.
blockquote>Таким образом, импликация
a.equals(b) => a.hashCode() == b.hashCode()
должна быть всегда истинной (если ваши методы реализованы правильно), но обратное значение
a.hashCode() == b.hashCode() => a.equals(b)
не обязательно имеет к.