Основным содержанием этой статьи является правильный метод оценки хэшкода в Java, следующим образом.
Существует оптимизация для хэш -списков, которые могут кэшировать хэш -код объекта. Если хэш -код не совпадает, он не будет проверять эквивалентность объекта и напрямую считать, что он является другим объектом. Если хэш -код (хэшкод) равен, он обнаружит, равны ли объекты.
Если объекты имеют тот же хэш -код (хэшкод), они отображаются с тем же хэш -ведром. Если хешкод всех объектов в хэш -списке совпадает, Hashlist выродится в связанный список, что значительно снижает эффективность его запроса.
Хорошая хэш -функция обычно имеет тенденцию «генерировать неравные хэш -коды для объектов, которые не хотят ждать». В идеале, хэш -функция должна равномерно распределять экземпляры в наборе, которые не хотят быть так далее ко всем возможным хешам, но очень трудно полностью достичь этой идеальной ситуации. Вот относительно простой и эффективный метод хэширования:
1. Сохраните ненулевое постоянное значение, например, 17, в переменной типа int, называемое результатом.
2. Для каждого ключевого домена F в объекте ( ссылаясь на каждый домен, участвующий в методе Equals ), выполните следующие шаги:
result = 31 * result + c; Операция умножения состоит в том, чтобы получить лучшую хэш -функцию. Например, если функция хэш в строке пропускает умножение, то все строки с различным алфавитным порядком будут иметь один и тот же хэш -код. Причина, по которой 31 выбирается здесь, заключается в том, что это странное первое место. Если множитель является равномерным числом и переполнено умножением, информация будет потеряна, поскольку умножение на 2 эквивалентно смещению. Преимущества использования основных чисел не очевидны, но результаты хеш обычно используются для расчета результатов хэш. 31 имеет хорошую функцию, то есть с использованием сдвига и вычитания вместо умножения, что может достичь лучшей производительности: 31 * i == (i << 5) - i. Сегодняшние виртуальные машины могут автоматически реализовать эту оптимизацию.Если класс неизменен (все домены являются окончательными модификациями, а все домены являются основными типами или являются неизменными классами), а накладные расходы расчета хэш -кодов также являются относительно высокими, то вам следует рассмотреть кэш хэш -код внутри объекта.
открытый класс hashcodedemo {static class hashcodeclass {private final boolean bresult; частный финальный байт -байт -байт; Частный финал Чар Чарвалу; Частный финальный короткометражный шорт; Частный финал Int Intvalue; Частный финальный длинное длинное положение; Частный финальный поплавок Floatvalue; частное окончательное двойное двойное значение; Частная финальная строка String; Частный финальный финал int [] arrayvalue; // летучие означает, что переменная хранится и получается в памяти каждый раз, чтобы убедиться, что переменная является новейшим частным летучим хэшкодом; public hashcodeclass () {bresult = false; bytevalue = 1; charvalue = 'a'; ShortValue = 1; intValue = 1; LongValue = 1L; floatvalue = 1,0F; DoubleValue = 1,0d; str = getClass (). getName (); arrayvalue = new int [] {1,2,3,4,5}; } @Override public int hashcode () {if (hashcode == 0) {// Установить ненулевое начальное значение для увеличения конфликта Zero Domain int result = 17; // Если мультипликатор опущен, то все строки с различным алфавитным порядком будут иметь одинаковый хэш -код окончательный код int hash_code = 31; result = hash_code * result + (bresult? 1: 0); result = hash_code * result + bytevalue; result = hash_code * result + charvalue; result = hash_code * result + shortValue; result = hash_code * result + intvalue; result = hash_code * result + (int) (longvalue ^ (longvalue >>> 32)); result = hash_code * result + float.floattointbits (floatvalue); Long DoubleLongValue = Double.DoubleTolongbits (DoubleValue); result = hash_code * result + (int) (DoubleLongValue ^ (DoubleLongValue >>> 32)); result = hash_code * result + (str == null? 0: str.hashcode ()); System.out.println ("str =" + str + ", str.hashcode =" + str.hashcode ()); result = hash_code * result + arrayvalue.hashcode (); результат возврата; } return hashcode; }} public static void main (string [] args) {hashcodeclass obj = new hashcodeclass (); System.out.println ("obj.hashcode =" + obj.hashcode ()); System.out.println ("obj ="+obj.toString ()); }}Выход
str = com.demo.test.hashcodedemo $ hashcodeclass, str.hashcode = -205823051obj.hashcode = 946611167str = com.demo.test.hashcodedemo $ hashcodeclass, str.hashcode=-205823051obj=com.demo.test.hashcodedemo$hashcodeclass@386c23df
Суммировать
Выше приведено в этой статье, в котором обсуждается правильный метод оценки хэшкода в Java, и я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!