Какие базовые методы есть у Object кроме toString
Что проверяют
Знаете ли вы класс Object целиком, а не только equals и hashCode, и понимаете ли контракты этих методов. Следом почти наверняка спросят, что сломается в HashMap, если переопределить equals без hashCode.
Как отвечать
Кроме toString() у java.lang.Object есть:
equals(Object): по умолчанию сравнивает ссылки, как==. Переопределённый обязан быть рефлексивным, симметричным, транзитивным, согласованным и возвращатьfalseдляnull;hashCode(): равные поequalsобъекты обязаны давать одинаковый хэш, обратное не требуется. По умолчанию это identity hash, а не адрес объекта в памяти;getClass():final, возвращает класс времени выполнения, точку входа в рефлексию. Сравнение черезgetClass()вequalsстроже, чем черезinstanceof, и не пускает наследников;clone():protected, без интерфейсаCloneableбросаетCloneNotSupportedException, копирует поверхностно. На практике вместо него пишут конструктор копирования;wait(),notify(),notifyAll(): механизм монитора, всеfinal, уwaitесть перегрузки с таймаутом. Вызываются только внутриsynchronizedпо тому же объекту, иначеIllegalMonitorStateException.wait()отпускает монитор и ждёт уведомления, условие проверяют в циклеwhileиз-за ложных пробуждений;finalize(): устаревший с Java 9 и помеченный к удалению с Java 18. Момент вызова не гарантирован, для ресурсов естьtry-with-resourcesиCleaner.
Хорошо добавить, что у record методы equals, hashCode и toString генерируются по компонентам, а в прикладном коде wait и notify почти вытеснены java.util.concurrent: BlockingQueue, CountDownLatch, Condition.
Где спотыкаются
Переопределяют equals, забыв hashCode. Равные объекты попадают в разные корзины HashMap, и поиск по равному, но другому экземпляру ключа вернёт null.
Строят hashCode на изменяемых полях, а потом меняют объект, уже лежащий в HashSet. Найти его там после этого не получится.
Вызывают wait() через if вместо while или вне synchronized. Первое ломается на ложных пробуждениях, второе сразу падает с исключением.