Иногда собеседования проводятся удалённо – по скайпу, используя программу Zoom или по телефону. Удалённое собеседование имеет свои нюансы – обычно, собеседуя на позицию Java Developer, вас не будут грузить слишком сложными вопросами и заковыристыми нюансами, которые можно знать лишь имея богатый опыт в работе с Java. В данной статье мы собрали наиболее распространённые вопросы на собеседовании, которое проводится по телефону или скайпу.
Почему в Java класс String неизменный?
String объявлен immutable (неизменяемым) из-за соображений переиспользования констант в пуле строк и в целях безопасности
Может ли абстрактный класс иметь конструктор?
Да, у абстрактного класса могут быть конструкторы
Какие методы определены в классе Object и должны быть переопределены в наследнике для использования в HashMap?
Методы equals и hashCode
В чём разница между методами sleep и wait?
Метод wait снимает блокировку с объекта, в отличие от метода sleep
В чём отличие List от Set в Java?
Элементы, помещённые в List, упорядочены и индексированы. List допускает дублирование элементов. Set не является упорядоченной коллекцией и не хранит дубли
Как в Java сделать класс неизменным (immutable)?
Объявить класс с модификатором final, сделать все поля класса final, изменять состояние только в конструкторе, копировать данные для изменных (mutable) полей
Наиболее подходящие классы для работы с деньгами?
Long (long) и BigDecimal. Класс double не годится из-за округления и плавающей точки
Когда следует использовать интерфейсы и абстрактные классы в Java?
На практике наиболее важное различие между интерфейсом и абстрактным классом в Java состоит в том, что Java не поддерживает множественное наследование с помощью классов. Зато вы можете реализовывать в одном классе несколько интерфейсов. Также, раньше нельзя было реализовывать методы в интерфейсах (default methods появились в Java 8)
В чём различие между HashMap и Hashtable?
Hashtable – потокобезопасная (thread safe) коллекция и, как следствие, медленнее. HashMap не является потокобезопасным классом. А ещё Hashtable не позволяет хранить null в качестве ключа, а HashMap даёт такую возможность.
В чём различие между ArrayList и LinkedList?
ArrayList под капотом использует массив для хранения элементов и, как следствие, сложность доступа к элементу по его индексу составляет O(1).
LinkedList являет собой двусвязный список, поэтому сложность поиска элемента в коллекции составляет O(n).
Чем отличаются перегрузка (overloading) и переопределение (overriding) методов?
- Overloading: перегрузка методов это создание нескольких методов с одним и тем же названием, но с разными сигнатурами
- Overriding: переопределение методов это определение метода, изначально определённого в классе-родителе, в классе-потомке
Назовите типы данных в Java
В Java существует два основных типа данных:
- Примитивные типы: int, long, float, double, short, byte, char, boolean
- Сылочные типы: классы, интерфейсы, массивы, переменные типов
Назовите различия между checked и unchecked исключениями
- Checked exceptions (проверяемые исключения): исключения, которые проверяются на этапе компиляции. Они должны оборачиваться в try-catch/try-finally блоки.
Эти исключения наследуются от класса Exception.
Примеры chechked исключений: IOEception, SQLException - Unchecked exceptions (непроверяемые исключение): исключения, которые не проверяются компилятором, но могут быть словлены в блоке try-catch/try-finally. Эти исключения наследуются от RuntimeException. Примеры таких исключений: NullPointerException, IllegalArgumentException
Являются ли массивы в Java экземплярами Object?
Да, массивы в Java – объекты. Это одно из ярких отличий Java от C++: массивы в Java имеют все методы класса Object и дополнительное неизменное свойство length – длина массива.
Может ли список List<Number> содержать в себе объекты типа Integer?
Да, так как Integer это подкласс от Number.
Можно ли передать в метод, принимающий параметр типа List<Number>, передать аргумент типа ArrayList<Number>?
Да, так как ArrayList<Number> является потомком типа List<Number>
Можно ли в метод, принимающий параметр типа List<Number>, передать аргумент типа ArrayList<Integer>?
Нет, так как ArrayList<Integer> не является потомком типа List<Number>. Но используя wildcards, можно этого добиться. Если изменить метод на приём параметра типа List<? extends Number>, в него можно будет передать аргумент типа ArrayList<Integer>
Что такое volatile переменная?
Ключевое слово volatile используется для переменных, которые могут читаться и изменяться разными потоками. Volatile гарантирует отношение happens-before
В чём разница между CountDownLatch и CyclicBarrier?
Оба класса впервые появились в Java 5. Основное их предназначение – ожидание завершения работы нескольких потоков. Ключевое отличие между ними в том, что CountDownLatch не может быть переиспользован после того, как счётчик достиг нуля (затворка сработала).
Является ли класс BlockingQueue потокобезопасным?
Да, методы put() и take() класса BlockingQueue являются потокобезопасными.
Для каких задач методы wait и notify вызывают в цикле?
Эти методы вызываются в цикле для того, чтобы предотвратить выполнение какой-либо задачи, если условие не выполнено и поток находится в состоянии выполнения. Проверка условия в цикле позволяет начать выполнение задачи в случае, если будет выполнено какое-то условие
В чём отличие между вызовами методов «abc».equals(str) и str.equals(«abc»)?
Вызов «abc».equals(str) гарантирует, что вызов метода equals будет осуществлён на существующем объекте «abc». Вызов str.equals(«abc») потенциально может выбросить исключение NullPointerException, так как переменная str может быть null
Что такое интерфейс-маркер?
Интерфейс-маркер / marker interface / tag interface – интерфейс, присутствие которого особым образом интерпретируется компилятором или JVM. Стоить отметить, что аннотации, появившиеся в Java 5, лучше подходят для этой задачи. Примеры интерфейсов-маркеров: Serializable, Cloneable
В чём разница между интерфейсами Serializable и Externalizable?
Интерфейс Externalizable даёт больше контроля над процессом сериализации и позволяет вам использовать собственный бинарный формат для ваших объектов.
Может ли тип Enum (перечисление) реализовывать интерфейс?
Да
Может ли тип Enum расширять класс?
Нет, так как Java позволяет наследоваться только от одного предка, а enum по умолчанию расширяет класс java.lang.Enum
Как предотвратить класс от наследования?
Можно объявить класс с модификатором final или объявить конструктор с модификатором private.
Возможно ли переопределение (overriding) статических методов?
Нет
Какие паттерны программирования вы знаете?
Наиболее распространёнными паттернами (шаблонами) программирования являются Singleton, Builder, Factory.
Чем различаются классы StringBuffer и StringBuilder?
Оба класса решают одну и ту же задачу – эффективную конкатенацию строк. Отличаются эти классы лишь тем, что StringBuffer потокобезопасен, а StringBuilder – нет. Если не предполагается использование в многопоточной среде, желательно выбирать StringBuilder, так как он будет работать быстрее