существуетОбъектная ориентация — штука в JavaВ этой статье мы оставили тему и представили Set. Мы знаем, что элементы в Set не могут повторяться. Без лишних слов, вот код:
Оптимизирован класс Person из предыдущей главы и сохранен метод isSame();
Предположительно все видят похожий код и начинают задаваться вопросом, не копает ли автор яму опять, чтобы все попрыгали, давайте посмотрим на результаты.
Правильно, есть питы, которые тоже являются объектами, и все они размещены в наборе: один печатает size() как 1, а другой печатает size() как 2.существуетОбъектная ориентация — штука в JavaВ одной статье,В классе Person, несмотря на то, что мы написали метод isSame() для оценки равенства бизнесов, в то время казалось, что это решает проблему, но мы сами того не зная вырыли себе дыру.Предположим, что теперь мы выплачиваем зарплату пользователям партиями, и Чжан Сан появляется дважды.Хотя мы используем Set для устранения бремени, Чжан Сан все равно будет получать выплаты дважды.
В программах на Java существует множество «условий», которые мы называем спецификациями программирования, и реализация кода с соблюдением этих спецификаций позволит вам избежать многих ошибок.Чтобы судить, равно ли содержимое двух объектов, не пишите метод (isSame()) для оценки, а следует переопределить метод equals родительского класса (здесь родительским классом является Object), вРазговор об равенствах в Java (Часть 1) — об этих вещах в Java, мы сказали, что String переопределяет метод equals(), поэтому здесь результат размера печати равен 1, но Person не переопределен, поэтому Set не может судить, являются ли два «Чжан Сан» одним и тем же человеком, и результат размера печати это 2.
Давайте еще раз посмотрим на следующий код:
Результат конечно все ложный (на это никто не может ответить неправильно), смотрите результат
Давайте перепишем метод equals класса Person как String.
Выглядит нормально, не забывай,Если это переопределенный метод, нам нужно добавить аннотацию @Override к методу., с помощью этой аннотации компилятор поможет вам проверить, действительно ли метод родительского класса переопределен. Скомпилируйте его, и сообщается об ошибке.
Получается, что вместо переопределения (переопределения) метода equals родительского класса мы написали метод equals с параметром Person, который вообще не переопределяет, а просто перегружает метод родительского класса.
перегрузка: В одном классе имя метода одинаковое, но количество параметров и тип параметров разные.
переписать: это относится к взаимосвязи между подклассом и суперклассом.Подкласс переопределяет метод суперкласса, но имя метода, тип параметра и количество параметров должны быть одинаковыми.
Ниже мы освещаем это правильно.
Давайте напишем тестовый код, чтобы протестировать его, здесь мы представляем List.
запустить его,В perList мы добавляем только человека1, а не человека2, но результат, напечатанный при выполнении perList.contains(person2), на самом деле истинен (список содержит человека2), просто потому, что метод equals() переопределен., Примечание: pSet.contains(person2)) по-прежнему ложно.
Затем выполните код в начале этой статьи, как и ожидалось, проблема остается
Очевидно, что после переопределения метода equals() класс Person уже поддерживает List, но еще не поддерживает Set. Для идеальной поддержки HashMap, HashSet, LinkedHashMap, ConcurrentHashMap и других классов необходимо переписать не только метод equals, но и метод hashCode().
Теперь давайте перепишем метод hashCode() в классе Person.
Выполните его снова и, наконец, увидите желаемый результат.
Выполните код в начале снова, это уже тот результат, который нам нужен.
Примечание. Будут объяснены HashMap, HashSet, LinkedHashMap, ConcurrentHashMap, List, hashCode и другие последующие столбцы, упомянутые в этой статье.
Резюме: Когда нам нужно переписать (переопределить) метод equals в реальном бизнесе, в соответствии со спецификацией, мы должны переписать (переопределить) метод hashCode. В реальном процессе разработки не рекомендуется переопределять метод equals, как только он появляется, если только у вас нет особых потребностей.
Ответьте на вопросы в разделе комментариев
В примере в начале этой статьи person1 и person2 не являются одним и тем же объектом. Метод equals по умолчанию наследуется от Object, что эквивалентно ==. Если нет дополнительных требований, чтобы было понятно, что имя является одинаковый, он будет рассматриваться как один и тот же объект. Нет необходимости переопределять метод equals.
Примечание. Эта колонка была впервые опубликована в общедоступной учетной записи: sayayJava. Все примеры кодов были загружены на официальный аккаунт, обратите внимание на загрузку, если вам это нужно.
Если вам нравится эта серия статей, пожалуйста, поставьте лайк или поделитесь со мной. Ваша поддержка является движущей силой для меня, чтобы продолжать. Вы также можете оставить сообщение в области комментариев. Если у вас есть возможность, эта колонка объяснит это. Наконец , не забудьте обратить внимание. Проверьте меня.
Перепечатка приветствуется, но с указанием "автора" и "оригинального адреса". Пожалуйста, сохраните этот абзац в тексте для перепечатки, спасибо за уважение авторских прав. Для коммерческого воспроизведения или публикации, пожалуйста, свяжитесь с автором для получения разрешения.
Предыдущий:Объектная ориентация — штука в Java
Следующий:Инициализация ArrayList - эти вещи в Java