7

В чем разница между == и equals() в Java?

1

Я хотел бы уточнить, правильно ли я понимаю следующее:

  • == — это сравнение по ссылке, то есть оба объекта указывают на одно и то же место в памяти;
  • .equals() — это сравнение значений внутри объектов.

Не стесняйтесь указывать, если я что-то не так понял!

5 ответ(ов)

7

В общем, ответ на ваш вопрос — "да", но...

  • Метод .equals(...) будет сравнивать только то, что вы указали в его реализации, не более и не менее.
  • Если класс не переопределяет метод equals, он по умолчанию использует метод equals(Object o) ближайшего родительского класса, который этот метод переопределяет.
  • Если ни один из родительских классов не предоставил переопределение, то используется метод из суперкласса Object, и вы получаете метод Object#equals(Object o). Согласно API класса Object, этот метод эквивалентен оператору ==; то есть, он вернет true только если обе переменные ссылаются на один и тот же объект, если их ссылки совпадают. Таким образом, вы будете проверять равенство объектов, а не функциональное равенство.
  • Всегда помните, что если вы переопределяете equals, то нужно также переопределить hashCode, чтобы не "нарушить контракт". Согласно API, результат, возвращаемый методом hashCode() для двух объектов, должен быть одинаковым, если их методы equals показывают, что они эквивалентны. Обратное не обязательно верно.
1

В отношении класса String:

Метод equals() сравнивает "значение" внутри экземпляров String (в куче), независимо от того, ссылаются ли две ссылки на объекты на один и тот же экземпляр String или нет. Если обе ссылки на объекты типа String ссылаются на один и тот же экземпляр String, то это отлично! Если же ссылки ссылаются на два разных экземпляра String, это не имеет значения. Сравнивается именно "значение" (то есть содержимое массивов символов) внутри каждого экземпляра String.

С другой стороны, оператор == сравнивает значение двух ссылок на объекты, чтобы определить, ссылаются ли они на один и тот же экземпляр String. Если значения обеих ссылок "ссылаются" на один и тот же экземпляр String, результат булевого выражения будет "true". Если же ссылки "ссылаются" на разные экземпляры String (даже если оба экземпляра String имеют идентичные "значения", т.е. содержимое массивов символов каждого экземпляра соответствует), результат булевого выражения будет "false".

Как и в любом объяснении, дайте этому немного времени, чтобы усвоить.

Надеюсь, это проясняет ситуацию.

0

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

String foo = new String("abc");
String bar = new String("abc");

if(foo == bar)
// Ложно (объекты идентичны, но не являются одним и тем же)

Затем, если мы присваиваем bar ссылку на foo:

bar = foo;

if(foo == bar)
// Истинно (Теперь объекты идентичны и являются одним и тем же)

В то время как метод equals() проверяет, ссылаются ли две переменные на объекты с одинаковым состоянием (значениями).

String foo = new String("abc");
String bar = new String("abc");

if(foo.equals(bar))
// Истинно (Объекты идентичны по значению, но не являются одним и тем же)

Таким образом, для проверки на идентичность объектов используйте ==, а для проверки на равенство их значений — метод equals().

0

Вам необходимо переопределить метод equals (а также другие методы) для использования с пользовательскими классами.

Метод equals сравнивает объекты по их содержимому.

Оператор == сравнивает адреса в памяти.

0

== является оператором, а equals() - методом.

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь