Ответ
В Java сравнение зависит от типа данных и контекста:
1. Сравнение примитивов
Используется оператор ==, который сравнивает значения:
int a = 10;
int b = 10;
System.out.println(a == b); // true
2. Сравнение объектов
==— сравнивает ссылки (адреса в памяти)equals()— сравнивает содержимое объектов (требует переопределения)
String s1 = "hello";
String s2 = new String("hello");
String s3 = "hello";
System.out.println(s1 == s2); // false — разные объекты
System.out.println(s1.equals(s2)); // true — одинаковое содержимое
System.out.println(s1 == s3); // true — кэширование в String pool
3. Проверка типа объекта
instanceof— проверяет принадлежность к классу/интерфейсу (с учётом наследования)getClass()— возвращает точный класс объекта
Object obj = "text";
// instanceof — проверяет иерархию
System.out.println(obj instanceof String); // true
System.out.println(obj instanceof Object); // true
// getClass() — точное сравнение классов
System.out.println(obj.getClass() == String.class); // true
System.out.println(obj.getClass() == Object.class); // false
4. Особенности Integer pool
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println(a == b); // true — значения из кэша (-128..127)
System.out.println(c == d); // false — новые объекты
System.out.println(c.equals(d)); // true — сравнение значений
Рекомендации:
- Для объектов всегда используйте
equals()вместо== - Переопределяйте
equals()иhashCode()согласованно - Для enum используйте
==(гарантированно один экземпляр)