Подтвердить что ты не робот

Почему код хэша разных булевых экземпляров всегда один и тот же?

В приведенном ниже коде хэш-код всегда один и тот же. Почему это так?

код:

public class BooleanClass {

    public static void main(String[] args) {
        Boolean b1 = new Boolean(true);
        Boolean b2 = new Boolean(false);
        Boolean b3 = new Boolean(true);
        Boolean b4 = new Boolean(false);
        Boolean b5 = new Boolean(false);
        Boolean b6 = new Boolean(true);

        System.out.println(b1.hashCode());
        System.out.println(b2.hashCode());
        System.out.println(b3.hashCode());
        System.out.println(b4.hashCode());
        System.out.println(b5.hashCode());
        System.out.println(b6.hashCode());
    }
}

Вывод:

1231
1237
1231
1237
1237
1231

Всегда печатаются те же номера 1231 и 1237. Любая причина?

4b9b3361

Ответ 1

JavaDoc метода Boolean.hashCode() говорит:

Возвращает целое число 1231, если этот объект представляет true; возвращает целое число 1237, если этот объект представляет false.

Ответ 2

Контракт для hashCode():

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

И хотя логическое значение имеет только два значения, true и false, вы получаете только два разных хеш-кода.

Ответ 3

Прямо из булевого класса:

 public int hashCode()
 {
   return ((this.value) ? 1231 : 1237);
 }

Это метод, который генерирует хэш-код для типа Boolean. Вот почему вы всегда получаете одинаковый хэш-код для true или false.

и это конструктор булевых

 public Boolean(boolean paramBoolean)
 {
   this.value = paramBoolean;
 }

поэтому this.value будет либо true, либо false, если true, это даст 1231, а если false, оно даст 1237

Ответ 4

Точкой хеширования является сопоставление данных произвольной длины с данными фиксированной длины. Значения, возвращаемые хэш-функцией, называются хеш-значениями, хеш-кодами, хэш-суммами, контрольными суммами или просто хэшами. Хеш-функция всегда возвращает тот же самый хэш, если вход один и тот же, поэтому хеширование true всегда будет равно 1231, а хеширование false всегда будет равно 1237

Ответ 5

Если вам действительно нужно различать экземпляры, а не значения - это очень редко то, что вы на самом деле хотите, но это случается иногда - см. IdentityHashMap.

(По сути, IdentityHashMap обходит как реализации .equals(), так и .hashcode() в объектном "реальном" классе и использует те из Object.)

Ответ 6

Я не понимаю, почему в этом вопросе было так много внимания. Я был бы удивлен, если бы это было иначе. Как это было хорошо указано другими, это даже указано в документации.

Но даже если нет документации, легко понять причину: вы можете просто проверить определение хэш-функции function.

Хэш-функция - это любой алгоритм, который отображает данные произвольной длины в данные фиксированной длины.

И из математическое определение map - это функция, которая означает, что одни и те же значения всегда будут давать одинаковое значение.

Если это не поможет, вы можете просто посмотреть на этот пример:

 int a = 400;
 int b = 400;

Должны ли вы ожидать, что хеши будут разными? Скорее всего нет. Так почему они должны быть разными в случае истинного и ложного?