Готовитесь к собеседованию по Java, чтобы получить работу в инвестиционном банке? вот список из 20+ основных вопросов Java с ответами

Есть много Java-разработчиков, пытающихся стать Java-разработчиками в инвестиционных банках, таких как Barclays, Credit Suisse, Citibank и т. Д .; тем не менее, многие из них не представляют, каких вопросов им там ждать.

В этой статье я поделюсь парой часто задаваемых вопросов от инвестиционных банков к Java-разработчику с более чем трехлетним опытом.

Да, эти вопросы не предназначены для новичков или профессионалов с опытом работы в Java от одного до двух лет, поскольку банки часто не принимают их на работу через открытые собеседования; в основном они присоединяются как аспиранты.

Не гарантируется, что вы получите эти вопросы; скорее всего, вы их не получите, но это даст вам достаточное представление о том, каких вопросов вы можете ожидать. Кстати, чем больше вы подготовитесь, тем лучше будет ваша подготовка.

Между прочим, если вы думаете, что 21 года недостаточно и вам нужно больше, ознакомьтесь с этими дополнительными 40 вопросами Java для телефонного собеседования и этими 200+ вопросами Java от последние пять лет тоже.

После того, как вы это сделаете, вы будете более уверены в любом собеседовании по Java, будь то телефонное интервью или личное собеседование.

В любом случае, не теряя больше времени, давайте погрузимся в некоторые из стандартных вопросов для собеседований по Java от банков, которые я собрал у некоторых моих друзей и коллег, которые участвовали в интервью в этих банках.

20+ вопросов на собеседовании по Java с ответами

Не теряя больше вашего времени, вот мой список некоторых часто задаваемых основных вопросов собеседований по Java.

Вопрос 1. Что плохого в использовании HashMap в многопоточной среде? Когда метод get () переходит в бесконечный цикл? ("отвечать")

Ответ: Ну ничего страшного; это зависит от того, как вы используете. Например, если вы инициализируете HashMap только одним потоком, а затем все потоки только читают его, тогда все в порядке.

Одним из примеров этого является Карта, содержащая свойства конфигурации.

Настоящая проблема начинается, когда хотя бы один из этого потока обновляет HashMap, то есть добавляет, изменяет или удаляет любую пару ключ-значение.

Поскольку операция put () может вызвать изменение размера, что в дальнейшем может привести к бесконечному циклу, поэтому вам следует использовать Hashtable или ConcurrentHashMap, позже будет еще лучше.

Вопрос 2. Не влияет ли переопределение метода hashCode () на производительность? ("отвечать")

Это хороший вопрос, и он открыт для всех, насколько мне известно, плохая функция хеш-кода приведет к частым столкновениям в HashMap, что в конечном итоге увеличивает время добавления объекта в Hash Map.

Начиная с Java 8, коллизия не будет влиять на производительность так сильно, как в более ранних версиях, потому что после порогового значения связанный список будет заменен двоичным деревом, что даст вам O (logN) в худшем случае по сравнению с O (n) связанного списка.

Вопрос 3: все ли свойства неизменяемого объекта должны быть окончательными в Java? ("отвечать")

Необязательно, как указано в статье с связанным ответом, вы можете достичь той же функциональности, сделав член неокончательным, но закрытым и не изменяя его, кроме как в конструкторе.

Не предоставляйте для них метод установки, и если это изменяемый объект, не допускайте утечки ссылок на этот член.

Помните, что делая ссылочную переменную окончательной, только гарантирует, что ей не будет присвоено другое значение. Однако вы по-прежнему можете изменять отдельные свойства объекта, на которые указывает эта ссылочная переменная.

Это один из критических моментов; Интервьюер любит слышать от кандидатов. Если вы хотите узнать больше о переменных final в Java, я рекомендую присоединиться к The Complete Java MasterClass на Udemy, одном из лучших практических курсов.



Вопрос 4: Как работает substring () внутри String? ("отвечать")

Еще один хороший вопрос на собеседовании по Java, я думаю, что ответа недостаточно, но вот он: «Substring создает новый объект из исходной строки, взяв часть исходной строки».

Этот вопрос в основном задавали, чтобы узнать, знаком ли разработчик с риском утечки памяти, которую может создать подстрока.

До версии Java 1.7 подстрока содержит ссылку на исходный массив символов, что означает, что даже подстрока из 5 символов расширена, может предотвратить сборку мусора в массиве символов размером 1 ГБ, содержа сильную ссылку.

Эта проблема была исправлена ​​в Java 1.7, где исходный массив символов больше не упоминается, но это изменение также сделало создание подстроки немного затратным с точки зрения времени. Раньше это было в диапазоне O (1), что могло быть O (n) в худшем случае Java 7 и далее.

Кстати, если вы хотите узнать больше об управлении памятью в Java, я рекомендую пройти курс Понимание виртуальной машины Java: управление памятью от Кевина Джонса на Pluralsight.



Кстати, вам понадобится членство Pluralsight, чтобы присоединиться к этому курсу, который стоит около 29 долларов в месяц или 299 долларов в год (скидка 14%). Если у вас нет этого плана, я настоятельно рекомендую присоединиться к нему, так как он улучшает ваше обучение, а вам, как программисту, всегда нужно узнавать что-то новое.

Кроме того, вы также можете использовать их 1 0-дневную бесплатную пробную версию, чтобы смотреть этот курс БЕСПЛАТНО.

Вопрос 5: Можете ли вы написать код критического раздела для синглтона? ("отвечать")

Этот основной вопрос Java является еще одним распространенным вопросом, и ожидается, что кандидат напишет синглтон Java с использованием блокировки с двойной проверкой.

Не забудьте использовать изменчивую переменную, чтобы сделать синглтон поточно-ориентированным.

Вот код критической части поточно-ориентированного шаблона Singleton с использованием идиомы блокировки с двойной проверкой:

public class Singleton {private static volatile Singleton _instance;/** * Double checked locking code on Singleton 
    * @return Singelton instance 
*/public static Singleton getInstance() {if (_instance == null) {synchronized (Singleton.class) {if (_instance == null) {_instance = new Singleton();}}}return _instance; }}

В то же время полезно знать о классических шаблонах дизайна, таких как Singleton, Factory, Decorator и т. Д. Если вас это интересует, то эта Библиотека шаблонов дизайна - отличная коллекция этого.

Вопрос 6. Как вы обрабатываете условия ошибки при написании хранимой процедуры или доступе к хранимой процедуре из java? (ответ)

Это один из сложных вопросов на собеседовании по Java, и снова он открыт для всех; мой друг не знал ответа, поэтому не возражал сказать мне.

Я считаю, что хранимая процедура должна возвращать код ошибки, если какая-то операция завершается неудачно, но если сама хранимая процедура не работает, то единственный выход - перехват SQLException.

В документе Эффективное третье издание Java также есть несколько полезных советов по работе с ошибками и исключениями в Java, которые стоит прочитать.

Вопрос 7. В чем разница между методом Executor.submit () и Executer.execute ()? (ответ)

Этот вопрос на собеседовании по Java взят из моего списка 50 лучших ответов на вопросы о многопоточности Java; Он становится популярным день ото дня из-за огромного спроса на Java-разработчика с хорошими навыками параллелизма.

Этот вопрос на собеседовании Java отвечает на то, что первый возвращает объект Future, который можно использовать для поиска результата из рабочего потока)

Есть разница при рассмотрении обработки исключений. Если ваши задачи вызывают исключение и если оно было отправлено с выполнением этого исключения, оно перейдет к обработчику неперехваченных исключений (если вы не указали его явно, по умолчанию будет просто выводить трассировку стека в System.err).

Если вы отправили задачу с submit() методом, любое выброшенное исключение, проверенное исключение или нет, является частью статуса возврата задачи.

Для задачи, которая была отправлена ​​с отправкой и завершается с исключением, Future.get () повторно вызовет это исключение, заключенное в ExecutionException.

Если вы хотите узнать больше о будущих, вызываемых и асинхронных вычислениях и вывести свои навыки параллелизма на Java на новый уровень, я предлагаю вам пройти курс Практика параллелизма Java в пакете от чемпиона Java Хайнца Кабуца. .

Это продвинутый курс, основанный на классической книге Практика параллелизма в Java, написанной не кем иным, как Брайаном Гетцем, которая считается библией для разработчиков Java. Курс определенно стоит вашего времени и денег. Поскольку параллелизм - серьезная и сложная тема, сочетание этой книги и класса - лучший способ изучить ее.

Вопрос 8: В чем разница между фабричным и абстрактным фабричным паттернами? (ответ)

Ответ: Abstract Factory предоставляет еще один уровень абстракции. Рассмотрим разные фабрики, каждая из которых является производной от абстрактной фабрики и отвечает за создание различных иерархий объектов в зависимости от типа фабрики. Например, AbstractFactory расширяется AutomobileFactory, UserFactory, RoleFactory и т. Д. Каждая фабрика будет отвечать за создание объектов в этом жанре.

Если вы хотите узнать больше о шаблоне проектирования Абстрактная фабрика, я предлагаю вам пройти курс Шаблон проектирования в Java, который предоставляет отличные реальные примеры для лучшего понимания шаблонов.

Вот UML-диаграмма фабрики и абстрактного фабричного шаблона:

Если вам нужно больше вариантов, вы также можете проверить мой список курсов 5 лучших шаблонов дизайна Java.

Вопрос 9: что такое синглтон? лучше синхронизировать весь метод или синхронизировать только критическую секцию? (ответ)
Синглтон в Java - это класс с одним экземпляром во всем приложении Java, например, java.lang.Runtime - это класс синглтона.

Создание синглтона было непростым делом до Java 4, но после того, как в Java 5 появился Enum, все стало просто.

Вы можете посмотреть мою статью Как создать потокобезопасный синглтон в Java для получения более подробной информации о написании синглтона с использованием перечисления и блокировки с двойной проверкой, что и является целью этого вопроса на собеседовании по Java.

Вопрос 10: можете ли вы написать код для перебора HashMap в Java 4 и Java 5? (ответ)
Хитрый, но ему удалось написать, используя while и цикл for. Есть четыре способа перебрать любую карту в Java; один предполагает использование необходимого Set () и перебора ключа, а затем использование метода get () для получения значений, что немного дорого.

Второй метод предполагает использование entrySet () и повторение по ним, либо применяя для каждого цикла, либо используя метод Iterator.hasNext ().

Это лучший подход, потому что во время итерации вам доступны как объект ключа, так и объект значения, и вам не нужно вызывать метод get () для получения значения, который может дать производительность O (n) в случае огромный связанный список в одном ведре.

Кроме того, вы можете ознакомиться с моим постом Четыре способа итерации по Map в Java для подробного объяснения и примеров кода.

Вопрос 11: Когда вы переопределяете hashCode () и equals ()? ("отвечать")

При необходимости, особенно если вы хотите выполнить проверку равенства на основе бизнес-логики, а не равенства объектов, например два объекта сотрудников равны, если у них одинаковые, даже если они являются двумя разными объектами, созданными разными частями кода.

Также необходимо переопределить оба этих метода, если вы хотите использовать их в качестве ключей в HashMap.

Теперь, как часть контракта с равным хэш-кодом в Java, когда вы переопределяете равенство, вы также должны переопределить хэш-код; в противном случае ваш объект не нарушит инвариант классов, например. Set, Map, для правильной работы которой используется метод equals ().

Вы также можете проверить мой пост Пять советов о равных в Java, чтобы понять тонкую проблему, которая может возникнуть при работе с этими двумя методами.

Вопрос 12: В чем будет проблема, если вы не переопределите метод hashCode ()? (ответ)
Если вы не замените метод equals, то контракт между equals и hashcode не будет работать, согласно которому два объекта, которые равны с помощью equals (), должны иметь тот же хэш-код.

В этом случае другой объект может возвращать другой хэш-код и будет храниться в этом месте, что нарушает инвариант класса HashMap, поскольку они не должны допускать дублирование ключей.

Когда вы добавляете объект с помощью метода put (), он выполняет итерацию по всем объектам Map.Entry, присутствующим в этом местоположении корзины, и обновляет значение предыдущего сопоставления, если Map уже содержит этот ключ. Это не сработает, если хэш-код не переопределен.

Если вы хотите узнать больше о роли equals () и hashCode () в коллекциях Java, таких как Map и Set, я предлагаю вам пройти курс Основы Java: Коллекции на Pluralsight от Ричарда Уорбертона

Вопрос 13: что лучше: синхронизировать критическую часть метода getInstance () или весь метод getInstance ()? (ответ)
Ответ - единственный критический раздел, потому что, если мы заблокируем весь метод, который каждый раз, когда кто-то вызывает этот метод, он должен будет ждать, даже если мы не создаем объект.

Другими словами, синхронизация нужна только при создании объекта, что происходит только один раз.

После того, как объект создан, нет необходимости в какой-либо синхронизации. Это очень плохое кодирование с точки зрения производительности, поскольку синхронизированные методы сокращают производство в 10-20 раз.

Вот UML-диаграмма паттерна проектирования Singleton:

Кстати, есть несколько способов создать потокобезопасный синглтон на Java, в том числе Enum, который вы также можете упомянуть как часть этого вопроса или любого последующего.

Если вы хотите узнать больше, вы также можете проверить Изучите шаблоны творческого проектирования на Java - курс #FREE от Udemy.



Вопрос 14: Где на картинке появляются методы equals () и hashCode () во время операции get () на HashMap? ("отвечать")

Этот основной вопрос собеседования по Java является продолжением предыдущего вопроса о Java, и кандидат должен знать, что как только вы упоминаете hashCode, люди, скорее всего, спросят, как они используются в HashMap.

Когда вы предоставляете важный объект, сначала вызывается метод хэш-кода для вычисления местоположения корзины. Поскольку сегмент может содержать более одной записи в виде связанного списка, каждый из этих Map.Entry объектов оценивается с помощью метода equals (), чтобы узнать, содержат ли они критически важный фактический объект или нет.

Я настоятельно рекомендую вам прочитать мой пост Как HashMap работает на Java, еще один рассказ об интервью, чтобы узнать больше по этой теме.

Вопросы 15: Как избежать тупика в Java? ("отвечать")

Если вы знаете, тупиковая ситуация возникает, когда два потока пытаются получить доступ к двум ресурсам, которые удерживаются друг другом, но для этого должны выполняться следующие четыре условия:

  1. Взаимное исключение
    По крайней мере один процесс должен находиться в режиме, запрещающем совместное использование.
  2. Удержание и ожидание
    Должен существовать процесс, удерживающий один ресурс и ожидающий другого.
  3. Без вытеснения
    ресурсы не могут быть вытеснены.
  4. Циклическое ожидание
    Должен существовать набор процессов

Вы можете избежать взаимоблокировки, нарушив условие циклического ожидания. Для этого в коде можно указать порядок получения и снятия блокировок.

Если бы блокировка была получена в логическом порядке и снята в прямо противоположном порядке, не было бы ситуации, когда один поток удерживает блокировку, полученную другими, и наоборот.

Вы также можете посмотреть мой пост как избежать взаимоблокировки в Java для примера кода и более подробное объяснение.

Я также рекомендую Применение параллелизма и многопоточности к общим шаблонам Java Хосе Паумар на Pluralsight для лучшего понимания шаблонов параллелизма для Разработчики Java.

Вопрос 16: В чем разница между созданием String как new () и literal? ("отвечать")

Когда мы создаем объект String в Java с помощью оператора new (), он встроен в кучу и не добавляется в пул строк, в то время как String, созданный с использованием literal, создается в самом пуле строк, который существует в области PermGen файла. куча.

String str = new String(“Test”)

Не помещает объект str в пул String, нам нужно вызвать String. Intern () , который используется для явного помещения их в пул строк.

Это только тогда, когда вы создаете объект String как строковый литерал, например. String s = “Test” Java автоматически помещает это в пул строк.

Между прочим, здесь есть уловка. Поскольку мы передаем аргументы как Test, который является строковым литералом, он также создаст другой объект как Test в пуле строк.

Это единственный момент, который остался незамеченным до тех пор, пока его не предложили знающие читатели блога Javarevisited. Чтобы узнать больше о разнице между строковым литералом и строковым объектом, прочтите эту статью.

Вот красивое изображение, которое хорошо показывает эту разницу:

Вопрос 17: Что такое неизменяемый объект? Можете ли вы написать неизменный класс? ("отвечать")

Неизменяемые классы - это классы Java, объекты которых нельзя изменить после создания. Любая модификация неизменяемого объекта приводит к новой цели; например, Строка неизменна в Java.

В основном неизменяемые классы также являются окончательными в Java, чтобы предотвратить переопределение подклассами методов, что может поставить под угрозу неизменяемость.

Вы можете достичь той же функциональности, сделав элемент не конечным, но закрытым и не изменяя его, кроме как в конструкторе.

Помимо очевидного, вам также необходимо убедиться, что вы не должны раскрывать внутреннюю часть неизменяемого объекта, в основном, если он содержит изменяемый член.

Точно так же, когда вы принимаете значение изменяемого члена от клиента, например. java.util.Date, используйте метод clone (), чтобы сохранить отдельную копию для себя, чтобы предотвратить риск того, что злонамеренный клиент изменит изменяемую ссылку после ее установки.

Те же меры предосторожности необходимо соблюдать при возврате значения для изменяемого члена, возвращать другую отдельную копию клиенту, никогда не возвращать исходную ссылку, содержащуюся в классе Immutable. Вы также можете посмотреть мой пост Как создать неизменяемый класс в Java с пошаговым руководством и примерами кода.

Вопрос 18: Предложите самый простой способ узнать время, необходимое для выполнения метода, без использования каких-либо инструментов профилирования? ("отвечать")

Считайте системное время непосредственно перед вызовом метода и сразу после его возврата. Возьмите разницу во времени, которая даст вам время, затраченное на выполнение плана.

Помните, что если время, затрачиваемое на выполнение, слишком мало, это может показать, что для производительности требуется ноль миллисекунд. Попробуйте его на методе, который достаточно велик, в некотором смысле тот, который выполняет значительный объем обработки.

Вопрос 19: Какие два способа вам нужно реализовать, чтобы использовать любой объект в качестве ключа в HashMap? ("отвечать")

Чтобы использовать какой-либо объект в качестве ключа в HashMap или Hashtable, он должен реализовать методы equals и hashcode в Java.

Вы также можете прочитать Как HashMap работает в Java для подробного объяснения того, как методы equals и hashcode используются для размещения и получения объекта из HashMap.

Вопрос 20: Как бы вы не допустили, чтобы клиент напрямую создавал экземпляры ваших конкретных классов? Например, у вас есть интерфейс Cache и два класса реализации - MemoryCache и DiskCache. Как обеспечить отсутствие объектов этих двух классов, созданных клиентом с помощью ключевого слова new ().
Я оставляю этот вопрос, чтобы вы попрактиковались и обдумали его, прежде чем я отвечу. Я уверен, что вы сможете найти правильный способ сделать это, поскольку это одно из важнейших решений, позволяющих сохранить контроль над классами в ваших руках, что отлично с точки зрения обслуживания.

Дальнейшее обучение

  1. Полный мастер-класс по Java
  2. Основы Java: язык Java
  3. Core Java SE 9 для нетерпеливых
  4. 200+ вопросов на собеседовании по Java

Заключительные примечания

Отлично !!, вы дочитали до конца статьи ... Удачи вам с собеседованием по программированию на Java! Конечно, это будет непросто, но, ответив на эти вопросы, вы на шаг приблизитесь к достижению своей цели.

Пожалуйста, подпишитесь на меня (javinpaul) на Medium, если вы хотите получать уведомления о моем новом сообщении, и не забудьте подписаться на меня в Twitter!

Другие статьи о Java, которые могут вам понравиться для изучения
Дорожная карта для разработчиков Java на 2021 год
10 вещей, которым Java и веб-разработчики должны научиться в 2021 году
10 инструментов для тестирования Разработчики Java должны знать
5 фреймворков, которые разработчики Java должны изучить в 2021 году
5 курсов по изучению больших данных и Apache Spark на Java
10 маршрутов для изучения DevOps для разработчиков Java
10 книг, которые должен прочитать каждый Java-программист
10 инструментов, которые Java-разработчики используют в своей повседневной работе
10 советов, как стать лучшим Java-разработчиком