Если вы хоть раз готовились к собеседованию на должность Java-программиста или сдавали любой экзамен (не обязательно по программированию) для получения сертификата, то, скорее всего, уже успели заметить, что вопросы, которые там задают, весьма специфичны. Многие из них заставляют подумать над архитектурой языка, некоторые рассчитаны на глубокие знания. Есть и те, что больше похожи на головоломки или касаются нюансов, которые прочувствовать без практики очень тяжело. В этой статье разработчик Саранс Синг (Saraans Singh) приводит несколько таких вопросов по Java. С ответами, разумеется.
1. Что произойдет, если поместить оператор return или System.exit () в блок try/catch?
Это очень популярный вопрос "на засыпку" по Java. Хитрость его в том, что многие программисты считают, что блок

finally
выполнится в любом случае. Данный вопрос ставит эту концепцию под сомнение, путем помещения оператора return
в блок try/catch
или вызова из блока try/catch
оператора System.exit ()
.
Ответ на этот каверзный вопрос: блок finally
будет выполняться при помещении оператора return
в блок try/catch
, и не будет выполняться при вызове из блока try/catch
оператора System.exit ()
.
2. Поддерживает ли язык Java множественное наследование?
Это очень хитрый вопрос. Интервьюеры часто говорят: если язык C++ может поддерживать непосредственное множественное наследование, то почему Java не может?
Ответ несколько более сложен, чем может показаться, поскольку Java поддерживает множественное наследование типов, ведь интерфейс в нём может расширять другие интерфейсы. Но множественное наследование реализаций язык Java не поддерживает.
3. В случае, когда метод генерирует исключение NullPointerException
в родительском классе, можно ли его переопределить методом, генерирующим RuntimeException
?
Еще один каверзный вопрос, связанный с концепциями перегрузки и переопределения.
Ответ: в переопределенном методе можно спокойно генерировать родительский класс исключения NullPointerException – RuntimeException
, но нельзя сделать то же самое с проверяемым исключением типа Exception
.
4. Как гарантировать возможность обращения N
нитей к N
ресурсам без взаимной блокировки?
Если вы не слишком хорошо разбираетесь в написании многопоточного кода, этот вопрос будет для вас по-настоящему каверзным. Он может оказаться непростым даже для опытного программиста, не имевшего дела с взаимными блокировками и состояниями гонки.
Весь трюк тут в упорядочении: предотвратить взаимную блокировку можно благодаря освобождению ресурсов в порядке, обратном порядку их получения.
5. В чем разница между классами StringBuffer
и StringBuilder
в языке Java?
Классический вопрос по языку Java, который некоторые разработчики считают хитрым, а другие – очень простым. Класс StringBuilder
появился в JDK 1.5 и единственное отличие между ними состоит в том, что методы класса StringBuffer
, например, length()
, capacity()
или append()
синхронизированы, в то время как соответствующие методы класса StringBuilder
– нет.
В силу этого фундаментального отличия, конкатенация строк при помощи StringBuilder
выполняется быстрее, чем с помощью StringBuffer
. На самом деле, использовать StringBuffer
не рекомендуется, поскольку в 99% сценариев использования, конкатенация строк производится в той же нити.
6. Что вернет выражение 1.0/0.0? Приведет ли оно к генерации исключения или ошибке при компиляции?
Еще один каверзный вопрос насчет класса Double
. Хотя разработчики Java знают о существовании простого типа данных double и класса Double
, при выполнении операций с плавающей точкой они не уделяют достаточного внимания Double.INFINITY
, NaN
, -0.0
и правилам, которым подчиняются связанные с ними арифметические вычисления.
Ответ на этот вопрос прост: генерации исключения ArithmeticException
не произойдет, будет возвращено значение Double.INFINITY
.
7. Что будет, если попытаться вставить в HashMap
уже имеющийся в ней ключевой объект?
Этот каверзный вопрос – часть другого часто задаваемого вопроса: как работают HashMap
в языке Java? HashMap
– популярная тема для запутанных и каверзных вопросов по языку Java.
Ответ таков: если попытаться повторно вставить ключ в HashMap
, он заменит старый, поскольку класс HashMap
не допускает дублирующихся ключей. А тот же ключ означает такой же хэш-код, так что он попадет в то же место в хэш-сегменте.
По материалам Quora
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ