Подтвердить что ты не робот

Зачем переопределять значения вместо использования имени другого метода

Это кажется глупым вопросом, но почему мы переопределяем метод equals вместо того, чтобы создавать новый метод с новым именем и сравнивать его?

Если я не переопределял равные значения, это означает, что == и равно проверяет, указаны ли обе ссылки на одну и ту же ячейку памяти?

4b9b3361

Ответ 1

Это кажется глупым вопросом, но почему мы переопределяем метод equals вместо того, чтобы создавать новый метод с новым именем и сравнивать его?

Поскольку все стандартные коллекции (ArrayList, LinkedList, HashSet, HashMap,...) используют equals при выборе того, являются ли два объекта равными.

Если вы придумаете новый метод, эти коллекции не будут знать об этом и не будут работать по назначению.

Очень важно понять следующее: если коллекция, такая как ArrayList вызывает Object.equals, этот вызов во время выполнения разрешит переопределенный метод. Поэтому, даже если вы изобретаете классы, о которых не известно коллекциям, они все равно могут вызывать методы, такие как equals, для этих классов.

Если бы я не переопределял equals, это означает, что оба == и равны проверке, указаны ли обе ссылки на то же место в памяти?

Да. Реализация Object.equals просто выполняет проверку ==.

Ответ 2

Вы переопределяете равные, если используете классы, которые полагаются на равные, например HashMap, HashSet, ArrayList и т.д.

Например, если вы сохраняете элементы своего класса в HashSet, вы должны переопределить hashCode и equals, если хотите, чтобы уникальность элементов определялась не простым ссылочным равенством.

Да, если вы не переопределяете равные значения, реализация по умолчанию равна реализации (как реализована в классе Object) такая же, как ==.

Ответ 3

В дополнение к основной причине, уже приведенной в других ответах, рассмотрим читаемость программы.

Если вы переопределяете equals и hashCode, кто-либо читает ваш код, знает, для чего предназначены эти методы. Это позволяет читателю определить критерии равенства значений между экземплярами вашего класса. Кто-то, читающий ваш код, который использует equals, сразу узнает, что вы проверяете равенство значений.

Если вы используете какое-то другое имя, оно будет только путать читателей и стоить им дополнительное время, просматривая ваши JavaDocs, чтобы узнать, для чего предназначен ваш метод.

Ответ 4

Потому что equals() - это метод класса Object, который является суперклассом всех классов и благодаря которому он по сути присутствует в каждом классе, который вы пишете. Следовательно, каждый класс коллекции или другие стандартные классы используют equals() для сравнения объектов. Если вы хотите, чтобы ваши пользовательские объекты классов поддерживались для равенства другими классами, вам необходимо переопределить только equals() (так как другие классы знают, что для вызова сравнения объектов equals()). Если вы используете только свои собственные классы, вы можете создать новый метод и убедиться, что все использует ваш собственный метод для сравнения.

Ответ 5

Метод equals и hashcode - это специальные методы, широко используемые в классах специальной утилиты java, а также классы wrpper, например. String, Integer переопределил этот метод, например, например. если вы размещаете какой-либо объект по вашему выбору, который имеет правильные значения equals и hashcode внутри HashSet, чтобы сохранить свойство уникальности, хэш-код будет сравниваться со всем существующим объектом в hashset, и если он найдет какой-либо из хэш-кодов, то он выглядит в метод equals, чтобы удвоить проверку, если оба они действительно равны, и если эта проверка равенства также проходит, тогда входящий объект отклоняется, но если проверка равенства хэш-кодов не передается, hashset не будет использоваться для метода equals и прямой способ разместить этот объект в хэшсет. Поэтому мы должны убедиться, что реализация equals и hashcode является логически правильной.

Ответ 6

Для класса, такого как HashMap<T,U>, необходимо иметь некоторые способы определения того, какой элемент в коллекции, если таковой имеется, должен считаться эквивалентным данному элементу. Существует два общих способа, посредством которых это можно выполнить:

  • Требование, чтобы все, что должно храниться в коллекции, должно включать виртуальные методы для выполнения такого сравнения (и предпочтительно предоставлять быстрое средство (например, hashCode()) для назначения классов частичной эквивалентности).

  • Требовать, чтобы код, который создает коллекцию, должен предоставлять объект, который может принимать ссылки на другие объекты и выполнять с ними операции, связанные с эквивалентностью.

Было бы возможно опустить equals и hashCode() из Object, и такие типы, как HashMap, могут использоваться только с ключами, реализующими интерфейс equatable, который включает такие элементы; код, который хочет использовать коллекции ссылок, на которые ссылается идентификатор, должен будет использовать IdentityHashMap. Такой дизайн не был бы необоснованным, но данный дизайн позволяет использовать универсальный тип коллекции коллекций, который использует HashMap для использования с вещами, которые сравниваются как по стоимости, так и по идентичности, а не необходимо определить отдельные типы для коллекции-HashMap и collection-of-IdentityHashMap.

Альтернативной конструкцией может быть тип GeneralHashMap, конструктор которого требует указания функции сравнения и имеет IdentityHashMap и HashMap оба из этого; последний ограничивал бы его тип до equatable и имел бы цепочки его идентичности с целями объектов, содержащихся в нем. Вероятно, не было бы ничего особенного в этом дизайне, но это не то, как делалось.

В любом случае должны быть некоторые стандартные средства, с помощью которых коллекции могут идентифицировать элементы, которые должны считаться эквивалентными; использование виртуальных equals(Object) и getHashCode() - это способ сделать это.

Ответ 7

Вопрос 1

Есть две вещи. equals() находится внутри класса Object Структура коллекции с использованием методов equals() и hashcode() при сравнении объектов

Вопрос 2

Да для сравнения двух объектов. но когда вы сравниваете два объекта String с помощью equals(), он проверяет только значение.