== является основным оператором в языке. Оператор == проверяет, ссылаются ли две переменные ссылки на объект на один и тот же экземпляр объекта.
equals () - это метод экземпляра, который в основном определяется классом java.lang.Object. Метод .equals () проверяет, являются ли два сравниваемых объекта эквивалентными, но они не обязательно должны быть точно такими же экземплярами одного и того же объекта.
Оператор == всегда дает один и тот же результат, но метод equals () дает вывод в соответствии с вашей реализацией (реализованной логикой). Надлежащее переопределение equals: соображения при каждом переопределении метода equals ().
1. Рефлексивный: для любой ненулевой ссылки x, x.equals (x) должен возвращать true.
2. Симметричный: для любых ненулевых ссылок x и y, если x.equals (y) имеет значение true, тогда y.equals (x) должен возвращать true.
3. Транзитивно: для любой ненулевой ссылки x, y и z, если x.equals (y) - true, y.equals (z) - true, тогда x.equals (z) должен вернуть true.
4. Согласованно: для любой ненулевой ссылки x и y множественные вызовы x.equals (y) последовательно возвращают true или последовательно возвращают false, не изменяя информацию, предоставленную для сравнений equals.
5. Для любой ненулевой ссылки x, x.equals (null) должен возвращать false.
ПРИМЕЧАНИЕ. Если o1.equals (o2) имеет значение true, тогда o1.hashcode () == o2.hashcode (), но обратное может быть или не быть истинным.
Примеры:
Целое число i = новое целое число (10);
Целое число j = i;
в приведенном выше коде. i == j верно, потому что и i, и j ссылаются на один и тот же объект.
целое число i = новое целое число (10);
Целое число j = новое целое число (10);
В приведенном выше коде i == j равно FALSE, поскольку, хотя они оба имеют значение 10, они представляют собой два разных объекта. Но i.equals (j) вернет true.
Использование автобокса
Целое число i = 10;
Целое число j = 10;
Логическое b = (i == j);
System.out.println (b);
Это вернет TRUE, поскольку целые числа между диапазонами от -127 до 128 будут объединены, поэтому в этом случае оба объекта будут одинаковыми (JVM не собирается создавать новый объект, он будет извлекать его из пула).
Строковый класс переопределяет метод equals, поэтому здесь приведен пример equals vs. ==
String s1 = new String ("abc");
String s2 = новая строка ("abc");
ПРИМЕЧАНИЕ. Строки создаются в пуле констант String, поэтому, когда мы создаем как String s = ”abc”, он проверит пул, вызвав собственный метод intern (), для его существования в существующем пуле, если он это сделал. не найдено ни одной строки, тогда он создаст новую, но если мы вызовем новый оператор, он создаст одну новую строку независимо от проверки существования пула.
public class StringEqualityTest {
public static void main(String []a){
String s1=new String("abc");
String s2=new String("abc");
System.out.print("s1.equals(s2) :"+s1.equals(s2)+" s1==s2 :");
System.out.println(s1==s2);
String s3="abc";
String s4="abc";
System.out.print("s3.equals(s4) :"+s1.equals(s2)+" s3==s4 :");
System.out.println(s3==s4);
}
}
ВЫВОД:
s1.equals (s2): правда s1 == s2: ложь
s3.equals (s4): правда s3 == s4: правда