Классы Java -оболочки и hashCode()

#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() , безусловно, может быть отрицательным — как здесь, так и в целом.