== vs equals()
== сравнивает значения примитивов и ссылки объектов; содержимое объектов сравнивает equals().
Доступно с: Java 1.0
Синтаксис
a == b / a.equals(b)Примеры
Для примитивов == сравнивает значения, для объектов — «тот же ли это объект»:
void main() {
int a = 1000;
int b = 1000;
IO.println(a == b);
String s1 = "hi";
String s2 = new String("hi");
IO.println(s1 == s2);
IO.println(s1.equals(s2));
}Результат:
true
false
trueЛовушка с обёртками Integer: маленькие числа кэшируются, большие — нет:
void main() {
Integer x = 127, y = 127;
Integer p = 1000, q = 1000;
IO.println(x == y);
IO.println(p == q);
IO.println(p.equals(q));
}Результат:
true
false
trueПримечания
Правило: примитивы (int, double, char, boolean) сравнивают через ==, объекты (String, Integer, записи, списки) — через equals(). Исключение — значения enum, их сравнивают через ==. Чтобы equals() работал для своего класса, его нужно переопределить (вместе с hashCode()); у записей это сделано автоматически.
Дробные числа double из-за погрешности редко равны точно: 0.1 + 0.2 == 0.3 — false. Сравнивайте с допуском: Math.abs(a - b) < 1e-9.
См. также
- String.equals() — Сравнивает содержимое двух строк.
- Object.equals() — Сравнивает объекты по смыслу. По умолчанию работает как ==, поэтому в своих классах его переопределяют.
- Objects.equals() — Сравнивает два объекта через equals(), безопасно для null.
В учебнике
- Операторы — Арифметические операторы Java, целочисленное деление и остаток, составное присваивание, инкремент, сравнение и логические операторы.