Всем привет! Решил задачу, но НЕ понимаю, почему финальное сравнение полей двух экземпляров классов должно быть именно таким:
(first == nSolution.first || (first != null && first.equals(nSolution.first))
            && last == nSolution.last || (last !=null && last.equals(nSolution.last))
- зачем first.equals(nSolution.first), если мы уже проверили - first == nSolution.first ? - зачем рядом с проверкой first.equals(nSolution.first) нужна проверка, что first - НЕ null? В общем, чувствую, что упускаю какие-то важные тонкости - пожалуйста, поясните.