# Собеседование Java-стажера Прохожу курс по Java в надежде получить знания и устроиться на работу. Здесь будут собраны вопросы с собеседований, представленные в данном курсе. ## Вопросы про Object #### Перечислите методы класса Object * `toString()` * `equals()` * `hashCode()` * `notify()` * `notifyAll()` * `clone()` * `finalize()` * `getClass()` * `wait()` * `wait(long timeout)` * `wait(long timeout, int nanos)` --- #### Что будет, если переопределить equals, но не переопределить hashCode? При сравнении элементов первоначально происходит проверка хэш-кода объектов. Если не переопределить метод `hashCode()` объекты будут иметь различные хэш-коды и сравнение прекратится. --- #### Зачем нужны методы wait, notify, notifyAll? Метод `wait()` и его перегрузки используются для освобождения занятого монитора и перевода вызывающего потока в состояние ожидания до тех пор, пока другой поток не вызовет метод `notify()`. `notify()` возобновляет работу случайного потока, находящего в состоянии ожидания. `notifyAll()` возобновляет работу всех остановленных потоков. --- #### Как правильно клонировать объект? Существует 2 вида клонирования: поверхностное и глубокое. Поверхностное клонирование создает новую ссылку на имееющийся объект. Глубокое же копирование создает новый объект и устанавливает значение атрибутов равными атрибутам клонируемого объекта. --- #### Зачем нужен метод finalize() и как он работает? Метод `finalize()` задает алгоритм действий, выполняемых объктом перед его уничтожением сборщиком мусора. Предназначен этот метод для автоматического освобождения системных ресурсов, занимаемых объектом, на котором будет данный метод вызван, например, закрытые соединение с каким-то ресурсом, когда оно больше не требуется. Полагаться на данный метод не стоит, так как нет никаких гарантий что он будет запущен. --- #### В чем отличие final, finally, finalize? `final` - ключевое слово, которое используется с: * классами (для запрета наследования от них) * переменными (для объявления их константами) * методами (для запрета переопределения) `finally` - часть конструкции `try..catch..finally`, используемая для гарантированного выполнения блока кода (блок finally выполняется независимо от результата в `try..catch`) `finalize` - данный метод описан выше --- #### Что такое try-with-resources? Конструкция для автоматического освобождения ресурсов. Она дает возможность объявлять один или несколько ресурсов в блоке `try`, которые будут закрыты автоматически без использования `finally` блока. --- #### Чем отличаются методы wait(1000) и sleep(1000)? `sleep()` приостанавливает поток на указанное. состояние меняется на TIMED_WAITING, по истечению — RUNNABLE. `wait()` меняет состояние потока на WAITING. `wait()` с параметрами меняет состояние потока на TIMED_WAITING. `wait()` может быть вызвано только у объекта владеющего блокировкой, в противном случае выкинется исключение *IllegalMonitorStateException*. При срабатывании метода блокировка отпускается, что позволяет продолжить работу другим потокам ожидающим захватить ту же самую блокировку. --- #### В чем отличие i++ и ++i Оба примера увеличивают значение переменной `i` на единицу. Однако при вычислениях проявляется различие: * `++i`, `i` сначала **увеличивается** на 1, затем участвует в выражении. * `i++`, `i` сначала **участвует** в выражении, затем увеличивается на 1. --- ## Вопросы про String #### Как правильно сравнить две строки в Java? Сравнивать строки необходимо с помощью метода `equals()`, т.к. строка в Java является объектом. ---