В чем разница между == и equals () в Java? - PullRequest
570 голосов
/ 22 сентября 2011

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

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

Правильно ли я понимаю?

Ответы [ 23 ]

0 голосов
/ 27 апреля 2016

По сути, == сравнивает, если два объекта имеют одинаковую ссылку в куче, поэтому, если две ссылки не связаны с одним и тем же объектом, это сравнение будет ложным.от Object класс.Этот метод по умолчанию сравнивает, если два объекта имеют одну и ту же ссылку.Это означает:

object1.equals(object2) <=> object1 == object2

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

Реализация hashCode(), когда установление равенства является частью Java Object Contract.Если вы работаете с коллекциями и не реализовали hashCode(), могут произойти странные плохие вещи:

HashMap<Cat, String> cats = new HashMap<>();
Cat cat = new Cat("molly");
cats.put(cat, "This is a cool cat");
System.out.println(cats.get(new Cat("molly"));

null будет напечатано после выполнения предыдущего кода, если вы не реализовали hashCode().

0 голосов

Пул строк (он же интернирующий ) и Пул целых чисел еще больше размывает разницу и может позволить вам использовать == для объектов в некоторых случаях вместо .equals

Это может повысить производительность (?) за счет большей сложности.

Например:

assert "ab" == "a" + "b";

Integer i = 1;
Integer j = i;
assert i == j;

Сложность компромисса: следующие могут вас удивить:

assert new String("a") != new String("a");

Integer i = 128;
Integer j = 128;
assert i != j;

Советую вам держаться подальше от такой микрооптимизации, и всегда использовать .equals для объектов и ==для примитивов:

assert (new String("a")).equals(new String("a"));

Integer i = 128;
Integer j = 128;
assert i.equals(j);
0 голосов
/ 02 февраля 2015

Поскольку Java не поддерживает перегрузку операторов, == ведет себя одинаково для каждого объекта, но метод equals () является методом, который может быть переопределен в Java, а логика сравнения объектов может быть изменена на основе бизнес-правил.

Основное различие между == и equals в Java заключается в том, что "==" используется для сравнения примитивов, а метод equals () рекомендуется для проверки равенства объектов.

Сравнение строк является распространенным сценариемиспользуя метод == и метод equals. Поскольку переопределение класса java.lang.String равно методу, он возвращает значение true, если два объекта String содержат одинаковое содержимое, но == возвращает значение true, только если две ссылки указывают на один и тот же объект.

Вот пример сравнения двух строк в Java на равенство с использованием метода == и equals (), который устранит некоторые сомнения:

public class TEstT{

    public static void main(String[] args) {

String text1 = new String("apple");
String text2 = new String("apple");

//since two strings are different object result should be false
boolean result = text1 == text2;
System.out.println("Comparing two strings with == operator: " + result);

//since strings contains same content , equals() should return true
result = text1.equals(text2);
System.out.println("Comparing two Strings with same content using equals method: " + result);

text2 = text1;
//since both text2 and text1d reference variable are pointing to same object
//"==" should return true
result = (text1 == text2);
System.out.println("Comparing two reference pointing to same String with == operator: " + result);

}
}
...