User zor07
zor07
31 уровень
Санкт-Петербург

Уровень 21. Ответы на вопросы к собеседованию по теме уровня

Статья из группы Архив info.javarush.ru
Уровень 21. Ответы на вопросы к собеседованию по теме уровня - 1
  1. Перечислите методы класса Object

    • equals()
    • hashCode()
    • toString()
    • getClass()
    • notify()
    • notifyAll()
    • wait()
    • wait(long timeOut)
    • wait(long timeOut, int nanos)
  2. Зачем нужны методы equals & hashCode?

    Используются для сравнения объектов.

    Цель метода equals – определить идентичны ли объекты внутри, сравнив внутреннее содержание объектов. Так equals работает медленно, сначала сравниваются хэш коды объектов, и, в том случае, если хэш коды равны, идет проверка по equals

  3. Что будет, если переопределить equals, но не переопределить hashCode?

    Изначально hashCode — случайное число.

    Коллекции в Java перед тем как сравнить объекты с помощью equals всегда ищут/сравнивают их с помощью метода hashCode(). И если у одинаковых объектов будут разные hashCode, то объекты будут считаться разными — до сравнения с помощью equals просто не дойдет.

  4. Зачем нужны методы wait, notify, notifyAll?

    Иногда в программе может оказаться такая ситуация, что нить вошла в блок кода synchronized, заблокировала монитор и не может работать дальше, т.к. каких-то данных еще не хватает: например, файл который она должна обработать еще не загрузился или что-нибудь в таком духе. Для решения этой проблемы и был придуман метод wait(). Вызов этого метода приводит к тому, что нить освобождает монитор и «становится на паузу».

    Для снятия с паузы используются методы notify, notifyAll. Метод notify «размораживает» одну случайную нить, метод notifyAll – все «замороженные» нити данного монитора.

  5. Как правильно клонировать объект?

    Два типа клонирования.

    Для клонирования объекта по умолчанию нужно:

    • Добавить интерфейс Cloneable своему классу
    • Переопределить метод clone и вызвать в нем базовую реализацию:
    
    class Point implements Cloneable
    {
     int x;
     int y;
    
     public Object clone()
     {
      return super.clone();
     }
    }
    

    Или можно написать реализацию метода clone самому:

    
    class Point 
    {
     int x;
     int y;
    
     public Object clone()
     {
      Point point = new Point();
      point.x = this.x;
      point.y = this.y;
      return point;
     }
    }
    
  6. Зачем нужен метод finalize() и как он работает?

    Если ты помнишь, то finalize() – это специальный метод, который вызывается у объекта перед тем, как сборщик мусора его уничтожит.

    Основная цель этого метода – освободить используемые внешние не-Java ресурсы: закрыть файлы, потоки ввода-вывода и т.п.

    finalize() работает нестабильно.

    Этот метод не оправдывает возложенных на него надежд. Java-машина может отложить уничтожение объекта, как и вызов метода finalize на сколько угодно. Более того, она вообще не гарантирует, что этот метод будет вызван. В куче ситуаций ради «оптимизации» он не вызывается.

  7. В чем отличие final, finally, finalize?

    • final — модификатор
    • Поля не могут быть изменены, методы переопределены
    • Классы нельзя наследовать
    • Этот модификатор применяется только к классам, методам и переменным (также и к локальным переменным)
    • Аргументы методов, обозначенные как final, предназначены только для чтения, при попытке изменения будет ошибка компиляции
    • Переменные final не инициализируются по умолчанию, им необходимо явно присвоить значение при объявлении или в конструкторе, иначе – ошибка компиляции
    • Если final переменная содержит ссылку на объект, объект может быть изменен, но переменная всегда будет ссылаться на тот же самый объект
    • Также это справедливо и для массивов, потому что массивы являются объектами, – массив может быть изменен, а переменная всегда будет ссылаться на тот же самый массив
    • Если класс объявлен final и abstract (взаимоисключающие понятия), произойдет ошибка компиляции
    • Так как final класс не может наследоваться, его методы никогда не могут быть переопределены

    finally — блок в связке try-catch-finally, код в котором выполнится независимо от того вылетело ли исключение в блоке try или нет. Используется для освобождения ресурсов.

    finalize — метод в классе Object см 6.

  8. Что такое try-with-resources?

    Это специальная конструкция try, называемая try-with-resources, в которой Обрати внимание – после try следуют круглые скобки, где объявляются переменные и создаются объекты. Эти объекты можно использовать внутри блока try, обозначенного скобками {}. Когда выполнение команд блока try закончится, независимо от того – нормально оно закончилось или было исключение, для объекта, созданного внутри круглых скобок (), будет вызван метод close();

  9. Чем отличаются методы wait(1000) и sleep(1000)?

    sleep() приостанавливает поток на указанное. состояние меняется на TIMED_WAITING, по истечению — RUNNABLE

    wait() меняет состояние потока на WAITING

    может быть вызвано только у объекта владеющего блокировкой, в противном случае выкинется исключение IllegalMonitorStateException. при срабатывании метода блокировка отпускается, что позволяет продолжить работу другим потокам ожидающим захватить ту же самую блокировку . в случае wait(int) с аргументом состояние будет TIMED_WAITING

  10. В чем отличие i++ и ++i?

    • ++i, i сначала увеличивается на 1, затем участвует в выражении.
    • i++, i сначала участвует в выражении, затем увеличивается на 1.
Комментарии (25)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ СДЕЛАТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Юсуф Уровень 25, Нижний Новгород, Россия
12 декабря 2020
пункт 9 - то есть разницы нет? wait(1000)==sleep(1000)?
Александр Колосов Уровень 36, Санкт-Петербург, Россия
21 января 2019
В первом вопросе не упомянуты методы clon() и finalize().
Андрей Стерхов Уровень 41, Ижевск, Россия
6 ноября 2018
Опять же третий вопрос. Не все коллекции в Java перед тем как сравнить объекты с помощью equals всегда ищут/сравнивают их с помощью метода hashCode(). Из коллекций только hashSet ну и плюс hashMap. Создайте какой-нибудь arrayList своих объектов, переопределите у своего класса методы hashcode и equals, поставьте break point в эти методы и вызовите в режиме дебага arrayList.contains(какой-нибудь из ваших объектов) и посмотрите какие методы вызовутся
Андрей Стерхов Уровень 41, Ижевск, Россия
5 ноября 2018
Ответ на вопрос про hashcode и equals неточен. Метод equals нужен, чтобы проверить идентичность объектов. А метод hashcode нужен, чтобы хранить объекты в hashset, hashmap и ,например, при поиске объекта в hashset или hashmap вначале сравнивается hashcode и только потом, если вдруг хэшкоды совпали, вызывается метод equals. А если вы просто у объекта вызовите equals, то у вас сразу вызовется метод equals без вызова метода hashcode
Ilya Sakharov Уровень 41, Москва
18 сентября 2018
А чего это не сделали в виде теста, как было на ранних уровнях? Пришлось прикрывать дисплей рукой, чтобы перед прочтением ответов ответить самому.
Rodriguez Уровень 33, Россия Expert
18 июля 2018
Большое спасибо за подборку!
mrANDERSON Уровень 26, Харьков, Украина
12 июля 2017
Ответ на 9й вопрос мне показался не полным и не понятным. ИМХО более полно и понятно следущее:

wait может быть «разбужен» другим потоком с использованием notify, sleep не может. Так же wait (иnotify) должны в быть synchronized блоке.

Object obj = ...;
synchronized (obj) {
obj.wait();
}

Пока текущий (выполняющийся) поток — ожидает waits и releases, другой поток может сделать

synchronized (obj) { obj.notify(); }

(на том же obj) и первый поток проснётся. Можно так же вызвать notifyAll, если более одного потока ожидают — это разбудит их всех. Тем не менее, только один из потоков сможет захватить монитор (т.к. wait в synchronized блоке).

Ещё одно различие в том, что wait вызывается на Object, в то время как sleep вызывается на Thread.

Если суммировать, то используйте sleep() для time-syncronization и wait() для multi-thread-synchronization.
mrANDERSON Уровень 26, Харьков, Украина
12 июля 2017
А что за метод private static native void registerNatives();?
pandaFromMinsk Уровень 39, Минск, Беларусь
26 июня 2016
3. Что будет, если переопределить equals, но не переопределить hashCode?

В качестве вводного предложения к ответу можно добавить, что
"… Если цель переопределить equals, то одинаково важно соблюсти и сигнатуру, и корректность условий сравнений объектов внутри метода, и правильность работы класса в целом, поскольку equals является частью определенной системы."

взято отсюда
Joysi Уровень 41, Россия
20 июня 2016
8. Что такое try-with-resources?
Дополнение: Объект в круглых скобках должен реализовывать (implements) интерфейс AutoCloseable или его потомков.