Object
    
    
        Что это
        Object - суперкласс для всех классов в JAVA, кроме примитивов. Необходим для предоставления основных
            методов в каждый java класс.
        
    
    
    
        Правила переопределения equals():
        
            - Рефлексивность - a.equals(a).
 
            - Симетричность - a=b, b=a.
 
            - Транзитивность - a=b, b=c, a=c.
 
            - Согласованость - каждый раз одинаковый результат.
 
            - Проверка на NULL - если NULL вернуть false.
 
        
        Пример equals(Object obj):
        
            public boolean equals(Object obj) {
            if (obj == this) {
            return true;
            }
            if (obj == null || obj.getClass() != this.getClass()) {
            return false;
            }
            
            Person guest = (Person) obj;
            return a == guest.a && b.equals(guest.b) && c.equals(guest.c) //Если ссылочная переменная то equals()
            }
        
    
    
        Пример hashcode():
        public int hashCode() {
        return Objects.hash(a, b, c);
        }
    
    
        Договор(контракт) между equals() и hashcode():
        
            - Если переопределен один из этих методов - нужно переопределить второй.
 
            - В обоих метода использовать одинаковые поля.
 
            - Если два объекта имеют разный hashcode, то они не равны.
 
            - Если два объекта равны, то они должны иметь один и тот же hashcode.
 
            - Если два объекта не равны, то они могут иметь или не иметь один и тот же hashcode(коллизия).