# Собеседование 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 является объектом.
---