предисловие
Текст был включен в мой репозиторий GitHub, добро пожаловать, звезда:GitHub.com/bin39232820…
Лучшее время посадить дерево было десять лет назад, затем сейчас
болтовня
Коллекция List закончена, и следующий шаг — поговорить о Map, потому что нижний слой Set — это Map. Но прежде чем мы поговорим о Map, нам нужно поговорить об equals и hashCode.
🔥Введение в самую полную коллекцию контейнеров Java в истории
🔥Основная структура данных самой полной коллекции Java-контейнеров в истории (разорванный вручную связанный список)
🔥ArrayList самой полной коллекции контейнеров Java в истории (интерпретация исходного кода)
🔥Vector и LinkedList, самая полная коллекция Java-контейнеров в истории (интерпретация исходного кода)
Зачем говорить об этих двух методах? Поскольку данные, хранящиеся в Listd, можно найти, но способ хранения элементов в Map связан с парами ключ-значение, а способ хранения элементов тесно связан с двумя методами equals и hashCode, поэтому перед анализом Map мы Давайте внимательно посмотрим на equals и hashCode, и чтобы лучше понять Map в будущем
метод равных()
Собственный метод equals объекта:
public boolean equals(Object obj) {
return (this == obj);
}
Как видно из кода, нативный метод equals использует «==» для сравнения. Любой, кто изучал Java, должен знать, что "==" сравнивает адреса памяти, поэтому родной метод equals вернет true только тогда, когда он сравнивает себя с самим собой, что является строгим способом судить, равен ли объект. Итак, если в классе есть своя концепция «логического равенства» (отличная от концепции равенства объектов), и суперкласс не переопределяет метод equals() для достижения желаемого поведения, то нам нужно переопределить метод equals() метод (общий. Другими словами, в бизнес-системе иногда требуется не равенство в строгом смысле, а равенство бизнес-объектов. Например: если идентификаторы в двух объектах равны, то два объекта считаются равный. Равный), в настоящее время нам нужно переписать метод equals, чтобы определить новый метод сравнения.
Общие соглашения, которые необходимо соблюдать при переопределении метода equals Общие соглашения, которые необходимо соблюдать при переопределении метода equals
- Самоанализ: для ненулевого x существует: x.equals(x) возвращает true
- Симметрия: для ненулевых x и y существует: x.equals(y)==y.equals(x)
- Транзитивность: для ненулевых x, y и z существование: когда x.equals(y) возвращает true, а y.equals(z) возвращает true, тогда x.equals(z) должно быть true
- Непротиворечивость: для ненулевых x и y результат нескольких вызовов x.equals(y) не меняется.
- Ненулевой: для ненулевого x есть x.equals(null) возвращает false
Переопределенный метод equals в String
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
Очевидно, что это сравнение контента, а не сравнение адресов. По аналогии, Math, Integer, Double и другие классы переписали метод equals(), чтобы содержимое сравнивалось. Конечно, примитивные типы используются для сравнения значений.
метод hashCode()
Метод HashCode в строке
Он просто использует 31* значение предыдущего символа + размер текущего символа, а затем проходит, чтобы получить хэш-значение типа String.
В Object hashCode используется метод Native. HashCode обычно используется для вычисления хеш-значения объекта. Он переписывается вместе, когда класс переписывает равные. Цель его перезаписи - гарантировать, что результаты hashCode двух объектов с одинаковыми равными непротиворечивы. Это сводится к Коллекции на основе хеша в Java, такие как HashMap, HashSet и т. д. Эти коллекции должны использовать хеш-значение объекта для участия в расчете и позиционировании. Целью использования hashCode является хеширование элементов.Возможность равномерного хеширования конечного элемента тесно связана с реализацией hashCode, которая является хеш-функцией.
Роль hashCode
Если вы хотите понять роль hashCode, вам нужно вернуться к тому, что мы называем контейнерами.В Java есть два типа коллекций: один — список, а другой — набор. Элементы в первом наборе упорядочены, и элементы могут повторяться; в последнем элементы неупорядочены, но элементы не могут повторяться. Вот вопрос: чтобы гарантировать, что элементы не повторяются, что следует использовать для определения того, повторяются ли два элемента?
Это метод Object.equals. Однако, если вы проверяете каждый раз, когда добавляете элемент, то когда элементов много, количество сравнений для элементов, добавленных в коллекцию, очень велико. То есть, если в коллекции сейчас 1000 элементов, то при добавлении 1001-го элемента в коллекцию будет вызываться метод equals 1000 раз. Очевидно, что это значительно снижает эффективность.
Итак, Java использует принцип хеш-таблицы. Хэш на самом деле является личным именем, поскольку он предложил концепцию алгоритма хэширования, он был назван в его честь. Алгоритм хеширования, также известный как алгоритм хеширования, заключается в прямом присвоении данных адресу по определенному алгоритму.Новички могут просто понять, что метод hashCode фактически возвращает физический адрес объектного хранилища (на самом деле его может и не быть).
Таким образом, когда в коллекцию нужно добавить новый элемент, сначала вызывается метод hashCode этого элемента, и можно сразу определить физическую позицию, в которую он должен быть помещен. Если в этой позиции нет элемента, его можно сохранить прямо в этой позиции без дальнейшего сравнения; если в этой позиции уже есть элемент, вызвать его метод equals для сравнения с новым элементом, если он такой же, то его не будет существовать. Если нет, хешируйте другие адреса, если они не совпадают. Таким образом, здесь возникает проблема разрешения конфликтов. Таким образом, фактическое количество вызовов метода equals значительно сокращается, почти всего один или два раза.
В заключение
Метод eqauls и метод hashCode указаны следующим образом.
- Если два объекта одинаковы, то их значения hashCode должны быть одинаковыми;
- Если hashCode двух объектов один и тот же, они не обязательно одинаковы (один и тот же объект здесь относится к сравнению с использованием метода equals).
- Два объекта, у которых equals() равны, их hashcode() должны быть равны; два объекта, у которых equals() не равны, не доказывают, что их hashcode() не равен.
- Зачем переопределять равенство? Поскольку в рамках коллекции java, equals используется для оценки того, равны ли два объекта.
Выходные данные
- Исходный код здесь — версия JDK8, разные версии могут отличаться, но основной принцип тот же.
конец
Хорошо, после того, как hashCode и equals закончены, мы можем знать, как гарантировать, что данные, которые мы храним, не дублируются. Далее начинается HashMap. Я думаю, с этой основой будет легче понять.
Поскольку блогер тоже новый разработчик, я также пишу во время обучения. У меня есть цель - две-три статьи в неделю. Надеюсь, я смогу придерживаться этого в течение года. Надеюсь, вы можете дать больше мнений, позвольте мне узнать больше. и добивайтесь прогресса вместе.
ежедневные комплименты
Хорошо всем, вышеизложенное является полным содержанием этой статьи. Люди, которые могут видеть это здесь, всеталант.
Творить нелегко. Ваша поддержка и признание — самая большая мотивация для моего творчества. Увидимся в следующей статье.
Six Meridians Excalibur | Text [Original] Если в этом блоге есть какие-то ошибки, прошу покритиковать и посоветовать, буду очень признателен!