Статьи

Топ-20 основных вопросов Java-интервью и ответов от инвестиционных банков

Это новая серия вопросов и ответов по основным интервью на Java в области финансов и в основном в крупных инвестиционных банках. Многие из этих вопросов об Java-интервью задаются в JP Morgan, Morgan Stanley, Barclays или Goldman Sachs. Банки в основном задавали основные вопросы интервью на Java по принципам многопоточности , сбора , сериализации, кодирования и разработки OOPS.

Я собрал эти вопросы у своих друзей и подумал поделиться со всеми вами. Я надеюсь, что это будет полезно для нас обоих. Также полезно практиковать некоторые вопросы интервью с программистами, потому что почти во всех интервью на Java появляются как минимум 1 или 2 вопроса о кодировании. Пожалуйста, поделитесь ответами на оставшиеся без ответа вопросы об интервью Java и дайте нам знать, насколько хороши эти вопросы об интервью Java? Если вы серьезно готовитесь к собеседованиям на Java и посещаете собеседования, то я также предлагаю взглянуть на собеседования по программированию на Java, представленные Markham .

Это книга для Java по образцу их раннего бестселлера, также о программировании интервью. Эта книга содержит вопросы не только из Java, но и из стека связанных технологий, например, JUnit, Maven, Design Patterns, JVM Internals, Android и Best Practices. Вопросы хорошие, а ответы четкие и хорошо объясненные, что делает его интересным для чтения.

20+ Core Java Интервью Вопросы Ответы

Эти вопросы по собеседованию на Java представляют собой смесь простых, сложных и хитрых вопросов о Java, например, почему множественное наследование не поддерживается в Java — один из самых сложных вопросов. Большинство вопросов задаются на старшем и опытном уровне, например, 3, 4, 5 или 6 лет опыта работы с Java, например, как HashMap работает на Java, которая наиболее популярна на опытных собеседованиях на Java.

Кстати, недавно я просматривал ответы и комментарии на вопросы интервью на Java, приведенные в этом посте, и нашел некоторые из них весьма полезными для включения в основной пост, чтобы принести пользу всем. Между прочим, помимо блогов и статей, вы также можете воспользоваться некоторыми книгами, которые специально написаны для прояснения любых интервью по программированию, а некоторые посвящены программированию на Java. Вспоминаются две книги: « Взлом собеседования по программированию и собеседование по программированию»: Секреты получения вашей следующей работы и. Обе книги посвящены программированию в целом и многим другим связанным темам, таким как структуры данных, алгоритмы, базы данных, SQL, сетевые и поведенческие вопросы, но также содержат концепции Java.

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

Ну, нет ничего плохого, в зависимости от того, как вы его используете. Например, если вы инициализируете HashMap только одним потоком, а затем все потоки только читают из него, то это прекрасно. Одним из примеров этого является карта, которая содержит свойства конфигурации. Реальная проблема начинается, когда хотя бы один из этих потоков обновляет HashMap, то есть добавляет, изменяет или удаляет любую пару ключ-значение. Так как операция put () может привести к изменению размера и может привести к бесконечному циклу, поэтому лучше использовать Hashtable или ConcurrentHashMap , чем позже.

Вопрос 2. Имеет ли переопределение метода hashCode () какое-либо влияние на производительность? ( ответ )

Это хороший вопрос, и он открыт для всех, так как, насколько мне известно, плохая функция хеш-кода приведет к частым столкновениям в HashMap, что в конечном итоге увеличивает время добавления объекта в Hash Map. Однако, начиная с Java 8, коллизия не будет влиять на производительность так же сильно, как в более ранних версиях, потому что после порога связанный список будет заменен двоичным деревом, что даст вам производительность O (logN) в худшем случае, так как по сравнению с O (n) из связанного списка.

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

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

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

Еще один хороший вопрос об интервью на Java, я думаю, что ответа недостаточно, но здесь он звучит так: «Подстрока создает новый объект из исходной строки, беря часть исходной строки». Этот вопрос в основном задавался, чтобы узнать, знаком ли разработчик с риском утечек памяти, которые может создать подстрока. До Java 1.7 подстрока содержит ссылку на исходный символьный массив, что означает, что даже подстрока длиной 5 символов может препятствовать сборке мусора в 1 ГБ из-за наличия сильной ссылки.

Как работает SubString в Java

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

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

Этот основной вопрос Java является продолжением предыдущего вопроса и ожидает, что кандидат напишет Java-синглтон с использованием двойной проверки блокировки. Не забудьте использовать переменную volatile, чтобы сделать Singleton поточно-ориентированным. Вот код для критической секции потокобезопасного шаблона Singleton с использованием дважды проверенной идиомы блокировки:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
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;
    }
 
}

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

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

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

Этот вопрос входит в мой список 15 самых многопоточных ответов на Java. Он становится популярным день ото дня из-за огромного спроса разработчиков Java с хорошими навыками параллелизма. Ответ таков: прежний возвращает объект Future, который можно использовать для поиска результата из рабочего потока.

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

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

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

фабрика против абстрактного фабричного образца

Вопрос 9: что такое синглтон? Лучше ли синхронизировать весь метод или синхронизировать только критическую секцию? ( ответ )

Singleton в Java — это класс с одним экземпляром во всем приложении Java, например, java.lang.Runtime — это класс Singleton. Создание Singleton было сложным до Java 4, но однажды Java 5 представила Enum очень просто.

Вопрос 10: Можете ли вы написать код для перебора HashMap в Java 4 и Java 5? ( ответ )

Хитрый, но он сумел написать, используя цикл while и for. На самом деле существует четыре способа перебора любой карты в Java, один из которых включает использование keySet() и перебор ключа, а затем использование метода get () для получения значений, что немного дороже. Второй метод включает использование entrySet() и итерацию по ним либо с использованием каждого цикла, либо с использованием метода Iterator.hasNext (). Это лучший подход, поскольку во время итерации вам доступны объекты ключа и значения, и вам не нужно вызывать метод get () для получения значения, что может дать производительность O (n) в случае большого связанного списка в одно ведро. Смотрите мой пост 4 способа перебора Map в Java для подробного объяснения и примеров кода.

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

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

Вопрос 12: В чем будет проблема, если вы не переопределите метод hashCode ()? ( ответ )

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

Java-головоломка равного хэш-код

Вопрос 13. Лучше ли синхронизировать критические секции метода getInstance () или всего метода getInstance ()? ( ответ )

Ответ — только критический раздел, потому что если мы заблокируем весь метод, то каждый раз, когда кто-нибудь вызывает этот метод, ему придется ждать, даже если мы не создаем никакого объекта. Другими словами, синхронизация необходима только при создании объекта, что происходит только один раз. Как только объект создан, нет никакой необходимости в какой-либо синхронизации. На самом деле, это очень плохое кодирование с точки зрения производительности, так как синхронизированный метод снижает производительность до 10-20 раз. Вот диаграмма UML шаблона Singleton:

Синглтон дизайн Pattern Java

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

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

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

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

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

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

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

1
String str = new String("Test")

не помещает объект str в пул String, нам нужно вызвать String.intern() который используется для явного помещения их в пул String. Только когда вы создаете объект String как литерал String, например String s = "Test" , Java автоматически помещает его в пул String. Кстати, здесь есть одна загвоздка Поскольку мы передаем аргументы как «Test», который является литералом String, он также создаст другой объект как «Test» в пуле строк. Это единственный момент, который остался незамеченным, пока знающие читатели блога Javarevisited не предложили это. Чтобы узнать больше о разнице между литералом String и объектом String, см. Эту статью.

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

Строковый литерал против Строкового объекта в Java

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

Неизменяемые классы — это классы Java, объекты которых нельзя изменить после создания. Любая модификация в неизменяемом объекте приводит к новому объекту. Например, String является неизменным в Java . Преимущественно неизменяемые классы также являются окончательными в Java, чтобы предотвратить переопределение подклассами методов, которые могут поставить под угрозу неизменность. Вы можете достичь той же функциональности, сделав член нефинальным, но закрытым, и не изменяя их, кроме как в конструкторе.

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

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

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

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

Чтобы поместить это в код …

1
2
3
4
5
long start = System.currentTimeMillis ();
method ();
long end = System.currentTimeMillis ();
 
System.out.println (“Time taken for execution is ” + (end – start));

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

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

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

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

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

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

Больше вопросов

  • 133+ Java Интервью Вопросы за последние 5 лет ( читать здесь )
  • 50+ вопросов по многопоточности Java за последние 3 года ( см. Здесь )
  • 50+ Программист по телефону Интервью Вопросы с ответами ( ссылка )

Рекомендуемые книги