Ответ 1
JavaDoc метода Boolean.hashCode()
говорит:
Возвращает целое число
1231
, если этот объект представляетtrue
; возвращает целое число1237
, если этот объект представляетfalse
.
В приведенном ниже коде хэш-код всегда один и тот же. Почему это так?
код:
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
. Любая причина?
JavaDoc метода Boolean.hashCode()
говорит:
Возвращает целое число
1231
, если этот объект представляетtrue
; возвращает целое число1237
, если этот объект представляетfalse
.
Контракт для hashCode():
Если два объекта равны в соответствии с методом
equals(Object)
, то вызов методаhashCode()
для каждого из двух объектов должен приводить к одному и тому же целочисленному результату.
И хотя логическое значение имеет только два значения, true
и false
, вы получаете только два разных хеш-кода.
Прямо из булевого класса:
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
Точкой хеширования является сопоставление данных произвольной длины с данными фиксированной длины. Значения, возвращаемые хэш-функцией, называются хеш-значениями, хеш-кодами, хэш-суммами, контрольными суммами или просто хэшами. Хеш-функция всегда возвращает тот же самый хэш, если вход один и тот же, поэтому хеширование true
всегда будет равно 1231
, а хеширование false
всегда будет равно 1237
Если вам действительно нужно различать экземпляры, а не значения - это очень редко то, что вы на самом деле хотите, но это случается иногда - см. IdentityHashMap
.
(По сути, IdentityHashMap
обходит как реализации .equals()
, так и .hashcode()
в объектном "реальном" классе и использует те из Object
.)
Я не понимаю, почему в этом вопросе было так много внимания. Я был бы удивлен, если бы это было иначе. Как это было хорошо указано другими, это даже указано в документации.
Но даже если нет документации, легко понять причину: вы можете просто проверить определение хэш-функции function.
Хэш-функция - это любой алгоритм, который отображает данные произвольной длины в данные фиксированной длины.
И из математическое определение map - это функция, которая означает, что одни и те же значения всегда будут давать одинаковое значение.
Если это не поможет, вы можете просто посмотреть на этот пример:
int a = 400;
int b = 400;
Должны ли вы ожидать, что хеши будут разными? Скорее всего нет. Так почему они должны быть разными в случае истинного и ложного?