Прежде всего, чтобы понять роль hashCode, вы должны сначала знать коллекцию в Java.
Вообще говоря, в Java существует два типа коллекций: один — List, а другой — Set.
Знаете ли вы их разницу? Элементы первого набора упорядочены и могут повторяться; элементы второго набора неупорядочены, но элементы не могут повторяться.
Итак, вот более серьезная проблема: если вы хотите гарантировать, что элементы не повторяются, что должно быть основой для определения того, повторяются ли два элемента?
Это метод Object.equals. Однако если вы будете проверять один раз при каждом добавлении элемента, то при большом количестве элементов количество сравнений между добавленными в коллекцию элементами будет очень большим.
Другими словами, если сейчас в коллекции 1000 элементов, то при добавлении в коллекцию 1001-го элемента он вызовет метод равенства 1000 раз. Это, очевидно, значительно снизит эффективность.
Поэтому Java использует принцип хеш-таблицы. Хэш на самом деле является именем человека. Поскольку он предложил концепцию хэш-алгоритма, он был назван в его честь.
Алгоритм хеширования, также известный как алгоритм хеширования, напрямую присваивает данные адресу в соответствии с определенным алгоритмом. Если вы подробно объясните алгоритм хеширования, это потребует большей статьи, поэтому я не буду представлять его здесь.
Новичкам понятно, что метод hashCode на самом деле возвращает физический адрес хранилища объектов (на самом деле это может быть не так).
Таким образом, когда в коллекцию добавляется новый элемент, сначала вызывается метод hashCode этого элемента, и сразу же можно определить физическое место, где он должен быть размещен.
Если в этой позиции нет элемента, его можно сохранить непосредственно в этой позиции без какого-либо сравнения, если в этой позиции уже есть элемент;
Просто вызовите его метод равенства, чтобы сравнить его с новым элементом. Если он тот же, он не будет сохранен. Если он не тот, другие адреса будут хешированы.
Таким образом, здесь возникает проблема разрешения конфликта. Таким образом, количество фактических вызовов метода Equals значительно сокращается, почти всего один или два раза.
Таким образом, Java предоставляет это для метода eqauls и метода hashCode:
1. Если два объекта одинаковы, то их значения hashCode должны быть одинаковыми. 2. Если hashCode двух объектов одинаковы, они не обязательно одинаковы. То, что вышеупомянутые объекты одинаковы, относится к сравнению с использованием. метод равенства.
Конечно, вам не обязательно делать это так, как требуется, но вы обнаружите, что тот же объект может появиться в коллекции Set. При этом эффективность добавления новых элементов будет сильно снижена. Метод хеш-кода используется для определения равенства двух объектов.
Тогда вы бы сказали: разве не существует метода, называемого «равно»? Да, эти два метода используются для определения равенства двух объектов. Но они разные. Вообще говоря, метод равенства вызывается пользователем. Если вы хотите определить, равны ли два объекта,
Вы можете переопределить метод равенства и вызвать его в своем коде, чтобы определить, равны ли они. Проще говоря, метод равенства в основном используется для определения равенства двух объектов по поверхности или по содержимому. Например, есть студенческий класс,
Единственными атрибутами являются имя и пол, поэтому мы можем думать, что, пока имя и пол равны, два объекта равны. Метод хеш-кода обычно не вызывается пользователями. Например, в хеш-карте, поскольку ключ не может повторяться.
Когда он определял, повторяется ли ключ, он оценивал метод хеш-кода, а также использовал метод равенства. То, что здесь нельзя повторить, означает, что пока одно из равных и хэш-код не равны, все будет в порядке! Проще говоря, хэш-код эквивалентен кодировке объекта, так же, как md5 в файле. Он отличается от равенства тем, что возвращает тип int, что по сравнению с ним не интуитивно понятно. Обычно мы перезаписываем хеш-код при переопределении равных, чтобы сделать их логику согласованной. Например,
Продолжая использовать только что приведенный пример, если имя и пол равны, даже если два объекта равны, то метод хэш-кода должен также возвращать значение хэш-кода имени плюс значение хэш-кода пола, поэтому логически они согласованы. .
Чтобы физически определить, равны ли два объекта, просто используйте ==