Java реализует == - PullRequest
       17

Java реализует ==

4 голосов
/ 14 декабря 2010

Я знаю, например, что в Python, если я переопределю метод __ cmp __ , я изменяю поведение ==.Я думал, что то же самое можно было бы сделать в Java, переопределив equals (например, когда вы переопределяете toString, это влияет на печать), но ... Нет, или, я не знаю как (я искал в Googleчто, ты не мог) Я прав?равно не влияет == ??Если так, то какой смысл равен ??Спасибо

Ответы [ 5 ]

6 голосов
/ 14 декабря 2010

Оператор Python == аналогичен .equals() в Java.Вы можете переопределить это с помощью .__cmp__() в Python и .equals() в Java.

Оператор Python * is совпадает с == в Java, и ни один из них не может быть переопределен.

5 голосов
/ 14 декабря 2010

Оператор == сравнивает объект ссылки на равенство. Метод equals предназначен для выполнения сравнения значение - например, два различных объекта String, которые представляют одинаковую последовательность символов, будут сравниваться равными, если вы используете equals, но не если вы используете ==.

Насколько я знаю, перегрузка операторов была исключена из Java из-за языкового дизайна. (Почему разработчики языка встроили перегрузку для + сверх String, уму непостижимо. Удобно, да, но IMO это обманывает.)

3 голосов
/ 14 декабря 2010

== это компаратор

.equals () - это метод

Необходимость equals заключается в том, что сравнение объектов не так просто, как простое сравнение.

Если вы скажете object1 == object2

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

Если, однако, вы хотите проверить, что атрибуты или даже подмножество атрибутов объекта являются одинаковыми, вы должны реализовать свой собственный метод equals и указать, что составляет два равных объекта.

Итак, ответ таков: что вы определяете как равное?

  • Два объекта, которые ссылаются на один и тот же объект в памяти? Тогда используйте ==
  • или два объекта, которые содержат одинаковые данные. Затем используйте .equals()
1 голос
/ 14 декабря 2010

Это не может быть сделано.Это одна особенность C ++, которую Java не унаследовала ...

1 голос
/ 14 декабря 2010

== сравнивает ссылки, а не значения. Использование == со ссылками на объекты обычно ограничивается следующим:

  1. Сравнение, чтобы увидеть, если ссылка нуль.
  2. Сравнение двух значений enum. Это работает, потому что есть только один объект для каждой константы перечисления.
  3. Вы хотите знать, относятся ли две ссылки к одному и тому же объекту

a.equals(b) сравнивает значения на равенство. Поскольку этот метод определен в классе Object, из которого получены все остальные классы, он автоматически определяется для каждого класса. Тем не менее, он не выполняет интеллектуальное сравнение для большинства классов, если класс не переопределяет его. Он был определен значимым образом для большинства основных классов Java. Если он не определен для (пользовательского) класса, он ведет себя так же, как ==.

...