Java равно и проблема хэш-карт - PullRequest
0 голосов
/ 24 марта 2010

Итак, я изучаю Java и пытаюсь понять равных, но я действительно не понимаю этого. Итак, мой вопрос: как работает equals? Спасибо

Ответы [ 3 ]

4 голосов
/ 24 марта 2010

equals - это метод, который вы используете, чтобы определить, совпадают ли два заданных объекта. Реализация по умолчанию для объекта equals: Они одинаковы, если имеют одинаковую ссылку .

Иногда ты этого не хочешь. Допустим, у вас есть класс ComplexNumber и два экземпляра со значением 1+i. Вы не хотите, чтобы они не были равны только потому, что они разные экземпляры. По сути, они представляют собой одно и то же число. В этом случае вы должны переопределить «равно», чтобы убедиться, что он ведет себя так, как задумано.

HashMaps использует информацию из equals, чтобы узнать, существует ли уже переданный вами ключ.

Из Эффективная Java Книга:

Всегда переопределять хэш-код, когда вы переопределить равно

Я бы также добавил к этому: особенно если вы используете Hashmap =)

Hashmaps также использует hashcode () для более быстрого поиска ключей, и результат для hashcode() должен соответствовать результату equals. Другими словами, если x.equals(y), то x.hashcode() == y.hashcode() (или у вас может быть неопределенное поведение для вашей хэш-карты). Вы можете иметь х и у с x.hashcode() == y.hashcode() и !x.equals(y)

Если вы хотите получить более конкретный ответ, задайте более конкретный вопрос =).

0 голосов
/ 24 марта 2010

equals() означает «значимо эквивалентный». Это не то же самое, что ==, что означает «это один и тот же объект». Все классы имеют метод equals(), унаследованный от класса Object. Например, скажем, вы пишете Car класс, в котором хранятся марка, модель и владелец:

Car carOne = new Car("Buick", "LeSabre", "John Doe");
Car carTwo = carOne;

Здесь equals() и == оба вернут true, потому что обе ссылки указывают на один и тот же автомобиль. Но для

Car carOne = new Car("Buick", "LeSabre", "John Doe");
Car carTwo = new Car("Buick", "LeSabre", "John Doe");

Есть два разных объекта, поэтому == возвращает false. Однако, поскольку обе машины принадлежат Buick LeSabres, принадлежащему Джону Доу, ваш equals() должен быть записан с возвращением true (при условии, что в этом примере никто не владеет более чем одной машиной одного типа).

Также, как указал Самуил, если вы переопределяете equals(), вы должны также переопределить hashCode(); причины этого выходят за рамки этого вопроса и хорошо документированы в других местах.

0 голосов
/ 24 марта 2010

Метод equals сравнивает значения на равенство.

метод equals определен в классе объекта, что означает, что любой другой класс может использовать этот метод для сравнения того, как он работает: он сначала проверит, ссылается ли он на себя, а затем на хеш-код объекта и равны ли они если это так, то он будет проверять каждое поле в этом объекте по отношению к полям объекта, который вы сопоставляете, с тем, почему вы можете спросить co, что haschode может быть таким же, но он все равно может содержать другие значения в полях, где шансы низкие, но это необходимо затем сравнить более подробно.

...