Как я устанавливаю MSI синхронно?

Какова ситуация, когда 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)

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

9
задан bltxd 13 October 2008 в 16:06
поделиться

1 ответ

Мы столкнулись с этим неоднократно с различными продуктами, и я закончил тем, что использовал маленькую внешнюю программу, которая запускает каждый msi и ожидает, пока он не заканчивает запускать следующий. Можно, вероятно, сделать это в чем-то столь же легком как vbscript, но в то время, когда мы хотели немного больше gui, таким образом, у нас была большая внешняя программа.

3
ответ дан 4 December 2019 в 20:26
поделиться
Другие вопросы по тегам:

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