35 >> 2 - означает, что нам нужно 2 раза разделить 35 на 2, отбрасывая остатки
35/2 = 17 (отбросили остаток 1)
17:2 = 8 (отбросили остаток 1)
Итого, 35 >> 2 должно быть равно 8.
64 << 3 - означает, что нам нужно 3 раза умножить 35 на 2
Итого, 64 << 3 должно быть равно 512
правила для переопределения методов equals() и hashCode():
Рефлексивность: Объект должен равняться себе самому.
Симметричность: если a.equals(b) возвращает true, то b.equals(a) должен тоже вернуть true.
Транзитивность: если a.equals(b) возвращает true и b.equals(c) тоже возвращает true, то c.equals(a) тоже должен возвращать true.
Согласованность: повторный вызов метода equals() должен возвращать одно и тоже значение до тех пор, пока какое-либо значение свойств объекта не будет изменено. То есть, если два объекта равны в Java, то они будут равны пока их свойства остаются неизменными.
Сравнение null: объект должны быть проверен на null. Если объект равен null, то метод должен вернуть false, а не NullPointerException. Например, a.equals(null) должен вернуть false.