@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Solution)) return false;
Solution solution = (Solution) o;
// return Objects.equals(first, solution.first) &&
// Objects.equals(last, solution.last);
return this.first.equals(solution.first) && this.last.equals(solution.last);
}
IDEA сгенерировала equals, потом я попробовал переписать, и не понимаю что не так.
подскажите в чем тут разница, заранее благодарен.
REM
29 уровень
в чем разница?
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Дмитрий СоснинExpert
3 мая 2019, 16:07
например если last у обоих будет равен null, то результат должен быть разным
0
REM
4 мая 2019, 07:58
Спасибо за подсказку, но теперь появилось еще больше вопросов:
Пишу тестовый код :
public class Test {
String first;
String last;
public static void main(String[] args) {
Test t = new Test();
Test test = new Test();
t.last = "sdf";
t.first = "fff";
test.last = "sdf";
test.first = "";
System.out.println(t.equals(test));
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Test)) return false;
Test solution = (Test) o;
// return Objects.equals(first, solution.first) &&
// Objects.equals(last, solution.last);
return this.last.equals(solution.last) && this.first.equals(solution.first) ;
}
}
результаты следующие:
1.false - т.е. все нормально отрабатывает, last у t и test одинаковые, first разные
2. если first у t и test сделать одинаковыми, то ответ правильный true.
проблемы начинаются дальше.
3. test.first = null - результат false, как и должно быть.
4. test.last = null - результат false, как и должно быть.
5. t.last = null; - результат ОШИБКА!??? - почему??? NullPointerException
почему чтото сравнить с null можно, а null сравнить с чемто нельзя?
6. t.first = null; - результат опять ошибка, не понятно почему ошибка но закономерность просматривается.
6.1 t.first = null и при этом last разный - результат false!!?????? - не понял, почему не ошибка, откуда взялся false????
---
если рассматривать метод equals класса Objects, то тут тоже есть вопросы
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
условия понятны.
1. сравниваем ссылки (a == b), если они равны то true, условие после || так же покажет true
и итог будет true || true , понятно что не выбрать все будет true.
2. если ссылки не равны, условие после || может быть 3 варианта :
0
REM
4 мая 2019, 08:05
2.1. a == null - false, дальше && но тут если a == null то будет ведь ошибка, а не false, и все равно будет false? что-то я видимо недопонимаю если в условии a != null && a.equals(b), условие слева до && дает результат а правая часть ошибка, я предполаогал что все будет ошибка.
2.2. (a == b) || (a != null && a.equals(b)); - преположим что результат (true) || (true && false)
видимо мне какую то тему нужно повторить, подскажите какую:( (true && false) - дает всегда false
а true || false - программа на выбор делает либо false либо true, написав такое предположение понял что само предположение глупо, наверное программа выдаст false а труе когда с обоих сторон true.
...запутался, изв.
0
Дмитрий СоснинExpert
4 мая 2019, 09:32решение
это станет понятнее, если принять во внимание особенности выполнения операторов && и ||
например рассмотрим строчку
первым делом ява проверит выражение (a == b) и если оно истинно, то часть || (a != null && a.equals(b)) не будет проверяться, так как считается, что
а вот если (a == b) == false, то начинаем рассматривать оставшуюся чать выражения, но по тому же принципу. если (a != null) == false, то (a.equals(b)) не выполняется +2
REM
4 мая 2019, 17:20
Спасибо.
Где то я прочитал что есть некая ленивая проверка.
Я так понимаю это тот случай.
|| - если true , то дальше проверка не идет.
а если && - и первое false - проверка тоже дальше не идет? ведь при любом раскладе будет false.
Еще раз спасибо!
0