Кто может объяснить, почему эта реализация (в прикрепленном решении) неверна? Кроме того, если переопределяю через alt+ ins, непонятно вот что: например, если не переопределить hashCode(), а переопределить только equals, то программа в этот переопределенный equals даже не заходит (проверял в режиме дебаг), а если переопределить hashCode(), то заходит? вроде никакой ссылки в переопределенном hashCode() на equals нет. И почему в equals if (first != null) возвращается false, а не true?
@Override
   public boolean equals(Object o) {
       if (this == o) return true;
       if (!(o instanceof Solution)) return false;

       Solution solution = (Solution) o;

       if (first != null ? !first.equals(solution.first) : solution.first != null) return false;
       return last != null ? last.equals(solution.last) : solution.last == null;
   }

   @Override
   public int hashCode() {
       int result = first != null ? first.hashCode() : 0;
       result = 31 * result + (last != null ? last.hashCode() : 0);
       return result;
   }