#java #hashcode #wrapper
#java #hashcode #оболочка
Вопрос:
есть ли какая-либо разница в ч / б значении, возвращаемом целыми числами hashCode()
и intValue()
? Может ли hashcode быть отрицательным?
Ответ №1:
Нет, разницы нет, и, следовательно, да, она может быть отрицательной или нулевой.
Из Javadoc:
Возвращает: значение хэш-кода для этого объекта, равное примитивному значению int, представленному этим
Integer
объектом.
Комментарии:
1. Целое число i = новое целое число(-1); Map map = новая хэш-карта(); map.put(i, «test»); // вызывает ли это исключение indexoutofboundsexception??
2. @Arjun: Конечно, нет, у карт нет индексов. У них есть ключи, и тип и значение ключей не имеют значения, пока они правильно реализуют equals и hashCode (во всяком случае, для HashMap).
3. AFAIK, hashmap внутренне поддерживает массив связанных списков. map.put(i, «test»); // внутренне это было бы array[i.hashCode()] = «test», поэтому я столкнулся с этим сомнением. пожалуйста, поправьте меня, если я ошибаюсь.
4. @Arjun: это так, но он отлично обрабатывает все значения hashCode. Если бы это было не так, вы не смогли бы этого сделать:
map.put("Hello, world!", someObj);
. Отрицательные значения hashCode так же распространены, как и положительные значения hashCode в равномерно распределенном хэше. Но вы же на самом деле не думаете, что каждая хэш-карта имеет массив такого размера,Integer.MAX_VALUE
чтобы вместить все положительные хэш-коды, не так ли? Существует простая модульная арифметика для преобразования любого int в допустимый индекс корзины.5. да, это большая отметка, которая выглядит как bucket_index = (i.hashCode() amp;amp; 0x7FFFFFFFF) % hashmap_size, здесь все решает.
Ответ №2:
Integer.hashCode()
просто возвращает значение, да… хотя полагаться на это не очень хорошая идея. Возвращаемое значение хэш-кода на самом деле следует использовать просто как непрозрачное значение, не придавая ему никакого особого значения — действительно следует принимать во внимание только равенство. Даже если Integer.hashCode()
задокументировано просто возвращать значение (РЕДАКТИРОВАТЬ: это так; см. Другой ответ), я бы очень опасался любого кода, который сломался бы, если бы реализация изменилась на return (скажем) value 1
.
Возвращаемое значение hashCode()
, безусловно, может быть отрицательным — как здесь, так и в целом.