JavaRush /Java блог /Архив info.javarush /Уровень 21. Ответы на вопросы к собеседованию по теме уро...
zor07
31 уровень
Санкт-Петербург

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

Статья из группы Архив info.javarush
Уровень 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.
Комментарии (29)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Suzuya Jūzō Уровень 44
22 марта 2023
Пункт 8 (дополню): Для того, чтобы объект использовался в конструкции try with resources, он должен реализовать интерфейс AutoCloseable.
Alexey Volkov Уровень 35
27 июля 2022
++i, i сначала увеличивается на 1, затем участвует в выражении. i++, i сначала участвует в выражении, затем увеличивается на 1. ______ самое грамотное объяснение "инкремента" которое я когда либо читал
Baggins Уровень 48
4 мая 2022
Спасибо
hamster🐹 Уровень 36
6 февраля 2022
Дополню третий вопрос Что будет, если переопределить equals, но не переопределить hashCode? Будет нарушение контракта между equals() и hashCode(), который гласит что: Если два объекта равны друг другу, то есть equals(Object) возвращает true, то вызов hashCode() у каждого из них должен возвращать одинаковые целые числа.
Юсуф Уровень 25
12 декабря 2020
пункт 9 - то есть разницы нет? wait(1000)==sleep(1000)?
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
Большое спасибо за подборку!