5.2 KiB
title | localeTitle |
---|---|
Checking for Equality | Проверка равенства |
Проверка равенства
В Java существует два способа проверить, являются ли две переменные «одинаковыми»: ==
и .equals()
. Однако эти методы работают не одинаково.
Оператор ==
Основная операция равенства в Java, ==
как в var1 == var2
, проверяет, указывают ли var1
и var2
одну и ту же ссылку на объект . То есть, если var1
является одним и тем же экземпляром класса в памяти как var2
, то var1 == var2
является истинным.
Однако, если var1
и var2
были созданы как два отдельных экземпляра класса (т.е. с new
ключевым словом), то var1 == var2
будет false. Даже если оба объекта содержат одни и те же свойства и значения, сравнение ==
не пройдет, потому что они не указывают на один и тот же объект в памяти.
Для примитивных типов переменных, таких как int
и double
, оператор ==
всегда может использоваться для проверки равенства, так как их значения хранятся непосредственно с переменной (а не как ссылка на другой слот в памяти).
int var1 = 1;
int var2 = 1;
System.out.println(var1 == var2) // true
MyObject obj1 = new MyObject();
MyObject obj2 = obj1;
MyObject obj3 = new MyObject();
System.out.println(obj1 == obj2) // true
System.out.println(obj1 == obj3) // false
System.out.println(obj2 == obj3) // false
Метод .equals()
Встроенный класс Object
в Java, который все остальные классы автоматически расширяют, содержит ряд полезных встроенных методов. Одним из таких методов является equals()
, который принимает в качестве своего аргумента другой объект и возвращает, следует ли считать два объекта «равными» в соответствии с соответствующей логикой для этого класса.
Класс String является одним из наиболее распространенных примеров класса, который переопределяет метод equals (). При сравнении двух «строк для равенства» вам нужно использовать метод «equals ()», поскольку «==» не будет работать так, как вы ожидаете.
String s1 = "Bob";
String s2 = "ob";
s2 = "B" + s2; //s2 теперь тоже "Bob"
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2)); //true
Когда вы создаете новый класс в Java, вам часто нужно переопределить метод equals()
, чтобы обеспечить более осмысленный способ сравнения двух объектов одного и того же класса. Как этот метод реализован - полностью зависит от суждения разработчика.
Например, вы можете решить, что два Person
должны считаться «равными», если их name
и dateOfBirth
одинаковы. Эта логика будет реализована в методе equals()
класса Person
:
public class Person {
public String name;
public Date dateOfBirth;
public boolean equals(Person person) {
return this.name.equals(person.name) && this.dateOfBirth.equals(person.dateOfBirth);
}
}
Большинство встроенных классов в Java, а также классы, предоставляемые популярными библиотеками, будут реализовывать метод equals()
подобным образом.
Например, интерфейс java.util.Set
указывает, что метод equals()
Set
возвращает true, если «указанный объект также является множеством, два множества имеют одинаковый размер и каждый член указанного множества содержится в этом наборе».
Однако, если класс не переопределяет реализацию equals()
по умолчанию, применяется реализация по умолчанию, которая просто использует оператор ==
для сравнения двух объектов.