10 интересных вопросов по Java, которые вам могут задать на собеседовании


Оглавление (нажмите, чтобы открыть):

Вопросы по Java на собеседовании (1)

1. Принципы объектно-ориентированного программирования (ООП)
2. Class и его свойства
3. Методы базового суперкласса Object
4. Отношения между классами : ассоциация, агрегация и композиция
5. Конструкторы класса
6. Абстрактный класс
7. Статический класс и его свойства
8. Модификаторы свойств класса
9. Использование this и super
10. Сигнатура метода
11. Переопределение и перегрузка методов
12. Инициализация статических полей
13. Использование оператора instanceof
14. Использование модификатора final
15. Порядок инициализации статических полей потомка и его предка
16. Определения понятия «интерфейса»
17. Вложенные и внутренние классы
18. Аннотации классов
19. Использование метода finalize
20. Отличие final, finally, finalize

1. Принципы объектно-ориентированного программирования (ООП)

Объе́ктно-ориенти́рованное программи́рование (ООП) — это методология программирования, основанная на представлении программного обеспечения в виде совокупности объектов, каждый из которых является экземпляром определенного класса. Базовой основой любого класса является Object, включающий определенный набор методов.

Основные принципы ООП : абстракция, инкапсуляция, наследование, полиморфизм.

Абстракция означает выделение значимой информации и исключение из рассмотрения незначимой. С помощью принципа абстракции программа разбивается на объекты. Информация в программе обрабатывается в виде цепочки действий между отдельными объектами. Главное достоинство абстракции связано с тем, что она позволяет отделить реализацию объектов от их описания.

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

Инкапсуляция (encapsulation) — это свойство объединения данных и методов в одном классе, позволяющее отделить внутреннее представление от внешнего (интерфейса). Инкапсуляция позволяет закрыть доступ к полям и методам класса другим объектам, либо предоставить доступ к полям класса через свои методы. Можно сказать, что, с точки зрения java, инкапсуляция – это «сокрытие реализации».

При использовании ООП желательно использовать непрямой доступ к свойствам (полям) какого-либо класса из методов других классов. Для этого в классе необходимо предусмотреть соответствующие методы.

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

Полиморфизм (polymorphism) — это свойство позволяет использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Полиморфные объекты наследуют один и тот же базовый класс; не обязательно, что базовый класс является родителем, он может «быть предком в третьем колене».

В качестве примера можно рассмотреть набор различных геометрических фигур (прямоугольник, квадрат, круг), которые используются в программе для рисования. Для всех этих объектов желательно создать базовый класс, в который включить поля описания параметров объекта и метод отображения в интерфейсе. Значения параметров и код методов будут определены (переопределены) в наследниках.

Подробное описание и примеры ООП представлены здесь.

2. Class и его свойства

Класс (Class) – это шаблон описания одного или нескольких объектов. Объект представляет экземпляр класса. Шаблон (класс) включает свойства, определяемые характеристиками объектов (полями объекта) и методами их управления. Поля класса определяют, например, такие характеристики объекта, как вес, размер, цвет, площадь и т.д. Методы класса позволяют «оперировать» его полями – определять значение (методы set), выдавать значение (методы get) и т.д.

Class может наследовать свойства другого класса. Первоосновой любого класса является суперкласс Object. Пример класса :

В примере представлен класс прямоугольника Rectangle, наследующий свойства класса (фигуры) Shape, и включающий переопределенные методы draw базового класса Shape и toString суперкласса Object. Метод toString возвращает описанные в Shape свойства класса width и height в текстовом виде. При описании свойств класса был использован модификатор public.

Более подробное описание класса с примерами представлено здесь.

3. Методы суперкласса Object

Object является базовым суперклассом для всех остальных объектов/классов Java, т.е. каждый класс наследует свойства Object. Соответственно все классы наследуют следующие методы суперкласса Object :

public final native Class getClass(); возвращает в run-time класс данного объекта;
public native int hashCode(); возвращает hash-код;
public boolean equals(Object obj); сравнивает текущий клас с объектом obj;
protected native Object clone() throws CloneNotSupportedException; клонирование объекта;
public String toString(); возвращает строковое представление объекта;
public final native void notify(); возобновление работа потока, находящегося в ожидании освобождения «монитора» данного объекта;
public final native void notifyAll(); возобновление работы всех потоков, находящихся в ожидании освобождения «монитора» данного объекта;
public final native void wait(long timeout) throws InterruptedException; поток переходит в режим ожидания в течение указанного времени timeout;
public final void wait(long timeout, int nanos) throws InterruptedException; переход потока в режим ожидания в течение указанного времени timeout;
public final void wait() throws InterruptedException; перевод потока в ожидание, пока другой поток не вызовет notify() или notifyAll() методы для этого объекта;
protected void finalize() throws Throwable; вызывается сборщиком мусора, когда garbage collector определил, что ссылок на объект больше нет.

Подробное описание с примерами использования методов hashCode и equals представлено в разделе безопасности. Примеры использования методов многопочного программирования wait, notify, notifyAll c описанием класса Thread (поток) и интерфейса Runnable можно увидеть здесь. Метод finalize описан ниже.

4. Отношения между классами : ассоциация, агрегация и композиция

Ассоциация — это отношение, при котором объекты одного типа определенным образом связаны с объектами другого типа. Так объект одного типа может содержать или использовать объект другого типа. Например, игрок Player играет в определенной команде Team. В этом случае класс Player будет связан отношением ассоциации с классом Team. Таким образом, идея ассоциации достаточно простая — два объекта могут быть между собой связаны и это надо как-либо образом описать.

Агрегация и композиция являются разновидностью ассоциации при отношении между целым и его частями.

Агрегация определяет отношение одного объекта к другому. Так, например, студент может посещать дополнительные факультативные занятия.

Композиция определяет более «жесткое отношение», при котором один объект может быть только частью другого объекта. Например Машина и Двигатель : двигатель может существовать отдельно без машины, но он не может быть в двух или трех машинах одновременно, в отличии от студента, который может посещать различные факультативные занятия.

5. Конструкторы класса

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

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

6. Абстрактный класс

Класс может быть объявлен абстрактным при помощи ключевого словом ‘abstract’. Абстрактный класс не предполагает создания экземпляров, а может быть использован только как базовый класс. Таким образом, абстрактные классы реализуют на практике один из принципов ООП — полиморфизм. Абстрактный класс может как содержать, так и не содержать абстрактные методы. Абстрактный метод базового класса должен быть переопределен для его неабстрактных потомков; в базовом классе абстрактный метод только описывается.

Пример абстрактного класса представлен здесь.

7. Статический класс и его свойства

Класс или его свойства могут быть объявлены статическими при помощи ключевого словом ‘static’. При обращении к статическим свойствам класса необходимо в префиксе указывать наименование класса. Статический класс может обращаться к нестатическим членам класса только при помощи объекта реализации класса.

В java можно использовать статический импорт, применяемый для импорта статических членов класса или интерфейса. Так, например, для импорта статических методов Math.pow() и Math.sqrt() можно использовать в секции import следующий код :

Статический импорт позволяет использовать вызов методов без наименования класса в префиксе.

8. Модификаторы свойств класса

Модификаторы класса позволяют определить уровень доступа к свойству класса. В java существуют следующие модификаторы доступа :

public (открытый) : поле и метод доступны всем;
protected (защищённый) : поле и метод доступны всем классам пакета и наследникам;
private (закрытый) : поле и метод доступны только методам этого класса;
без модификатора : default, friendly, доступ по умолчанию только внутри своего собственного пакета.

Примечание : конструктор класса также может иметь модификатор. Если класс имеет единственный конструктор с модификатором private, то невозможно создать объект данного класса. От такого класса нельзя наследоваться. При попытке наследования будет выдаваться ошибка :
There is no default constructor available in nameClass
А при попытке создать объект этого класса:
nameClass() has private access in nameClass

Можно ли обойти отмеченное выше Примечание? Можно, если в этом классе создать метод, который возвращает экземляр данного класса. Пример :

А теперь, создаем объект класса, у которого единственный конструктор с модификатором private. Конечно, new TestPrivate() здесь не пройдет, но решить данную задачу с использованием внутреннего статического метода можно.

9. Использование this и super

Чтобы обратиться к свойству текущего класса используют this, а к свойству базового класса — super. Так, например, в следующем примере класс Dog наследует свойства класса Animal и переопределяет метод eat(). Для обращения к переопределенному методу eat() своего класса используется вызов this.eat() в методе thisEat. Но, чтобы обратиться из наследника Dog к методу eat() базового класса Animal используется вызов super.eat() в методе superEat.

Более подробное описание наследования и пример использования this и super представлено здесь.

10. Сигнатура метода

Сигнатура метода (method signature) включает наименование метода с параметрами. При этом порядок параметров методов имеет значение. В сигнатуру метода не входят модификаторы, возвращаемое значение и вызываемые методом исключения. Также в сигнатуры не включены операнды synchronized, native и аннотация метода.

11. Переопределение и перегрузка методов

Если в иерархии классов сигнатура метода класса-наследника совпадает с сигнатурой метода родительского класса, то метод подкласса переопределяет метод базового класса. Вызов переопределённого метода из своего подкласса всегда ссылается на версию, определённую подклассом, а версия метода родительского класса будет скрыта. Чтобы вызвать «переопределенный» метод родительского класса следует использовать super.

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

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

12. Инициализация статических полей

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

Динамический блок является дополнением к конструктору. В следующем коде роль динамического блока играет процедура init :

Статические блоки в java выполняются до выполнения конструктора. С их помощью инициализируются статические поля.

13. Использование оператора instanceof

Оператор instanceof позволяет проверить принадлежность объекта к определенному классу/родителю. Выражение возвращает true, если объект является экземпляром класса или его потомком. В следующем примере демонстрируется использование оператора instanceof в различных условиях :

14. Использование модификатора final

Модификатор final может быть применен к полям, методам или классам. Смысл в его применении зависит от сущности, к которой он применен :

  1. Класс с модификатором final не может иметь наследников.
  2. Метод с модификатором final не может быть переопределен в классах наследниках.
  3. Поле помеченное при помощи слова final не может изменить свое значение после инициализации. Инициализируется поле либо при описании, либо в конструкторе, либо в статическом или динамическом блоке.
  4. Значение локальных переменных, а также параметров метода помеченных при помощи слова final не могут быть изменены после присвоения.

15. Порядок инициализации статических полей потомка и его предка

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

16. Определения понятия «интерфейса»

Ключевое слово «интерфейс» (interface) используется для описания полностью абстрактного класса. В описании интерфейса определяются статические поля и методы без тела (кода). Описание методов интерфейса выполняется в классе, реализующим данный интерфейс.

Реализация интерфейса «определяет поведение» класса. Т.е. именно так должны выглядеть все классы, которые реализуют данный интерфейс : включать статические поля и методы. Таким образом, любой класс, реализующий конкретный интерфейс, «знает» только те статичесие поля и методы, которые представлены в интерфейсе, но не более этого (наследование и реализация в несколько поколений расширяет диапазон статических полей и методов наследника).

Пример описания интерфейса SomeInterface и его реализации в классе SomeClass :

По умолчанию все поля, описанные в интерфейсе автоматически являются статическими (static) и неизменными (final). Все методы и переменные неявно объявляются как public. Начиная с 8-ой версии Java в интерфейсе можно объявлять static методы, но они должны включать тело метода.

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

Описание и пример использования интерфейса представлено здесь.


17. Вложенные и внутренние классы

Вложенный класс (nested classes) представляет собой класс, который объявлен внутри объявления другого класса. Вложенные классы могут быть статическими и нестатическими. Нестатические вложенные классы имеют и другое название — внутренние классы (inner classes).

Внутренние Java классы делятся на три вида :

  • внутренние классы-члены;
  • локальные классы;
  • анонимные классы.

Внутренние классы-члены (member inner classes) ассоциируются не с самим внешним классом, а с его экземпляром. Такие классы имеют доступ ко всем полям и методам внешнего класса.

Локальные классы (local classes) определяются в блоке java кода. На практике чаще всего объявление происходит в методе некоторого другого класса. Хотя объявлять локальный класс можно внутри статических и нестатических блоков инициализации.

Анонимный класс (anonymous class) — это локальный класс без имени.

Из внутреннего нестатического класса можно обратиться к нестатическому полю внешнего класса с использованием наименования внешнего класса и оператора this. Например, OuterClass.this.fieldName.

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

Описание и пример использования вложенных (внутренних) классов представлено здесь.

18. Аннотации классов

Аннотация («annotation») в языке Java – это специальная форма метаданных, которая может быть добавлена в исходный код. Аннотированы могут быть пакеты, классы, методы, переменные и параметры. Аннотации стали доступны в самом языке начиная с 5-ой версии Java. В 6-ой версии Java аннотации были интегрированы в компилятор javac.

Имеются встроенные широко используемые аннотации, которые отслеживаются средой разработки IDE и применяются к методу класса :

  • @Override — проверка переопределения метода. IDE вызывает предупреждение компиляции, если метод не найден в родительском классе;
  • @Deprecated — IDE отмечает, что метод устарел и вызывает предупреждение компиляции, если метод используется.
  • @SuppressWarnings — аннотация указывает IDE подавить предупреждения компиляции.

Аннотации, применяемые к другим аннотациям :

  • @Retention — определяет режим хранения аннотации (в исходном коде или в скомпилированном классе);
  • @Documented — отмечает аннотацию для включения в документацию;
  • @Target — отмечает аннотацию как ограничивающую (какие элементы java-аннотации могут быть к ней применены);
  • @Inherited — отмечает, что аннотация может быть расширена подклассами аннотируемого класса.

Подробнее об аннотациях можно прочитать здесь.

19. Использование метода finalize

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

Можно использовать finalize для чистки данных. Но, во-первых, нет гарантии, что он будет вызван, если где-то в коде осталась ссылка на объект. Ну, и во-вторых, нет гарантии на то, что метод будет вызван сразу. Это связано с тем, что если в объекте переопределен метод finalize, то он вызывается не сразу, а помещается в очередь, которая обрабатывается специально созданным для этого потоком. Следует отметить, что в очередь на «финализацию» попадают только те объекты, в которых переопределен метод finalize.

Порядок очистки объектов

Cборщик мусора Garbage Collector не вызывает методы finalize() напрямую (по крайней мере, в HotSpot 1.6), а только добавляет соответствующие объекты в специальный список, вызывая статический метод java.lang.ref.Finalizer.register(Object). Объект класса Finalizer формирует двусвязный список ссылок на объекты, для которых необходимо вызвать finalize(). Т.е. в списке хранятся ссылки на следующий и предыдущий finalize().

Непосредственный вызов методов finalize() происходит в отдельном потоке «Finalizer» (java.lang.ref.Finalizer.FinalizerThread), который создаётся при запуске виртуальной машины, а точнее в статической секции при загрузке класса Finalizer. Методы finalize() вызываются последовательно в том порядке, в котором были добавлены в список сборщиком мусора. Соответственно, если какой-то finalize() зависнет, то он подвесит поток «Finalizer», но не сборщик мусора. Таким образом, если объект не имеет метода finalize(), то он будут исправно удаляться, а вот объекты с методом finalize будут увеличивать очередь до тех пор, пока «не отвиснет» поток «Finalizer», не завершится приложение или не кончится память.

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

20. Отличие final, finally, finalize

У этих операторов общим является только корень final, и то, что они являются зарезервированными словами в Java.

final — модификатор, применяющийся к классам, методам, переменным.

finally является частью конструкции try-catch-finally, где играет роль блока, который выполняется независимо от событий происходящих в try-catch и выполняется в любом случае.

Junior Java Developer – вопросы на собеседовании

В этой статье мы рассмотрим 25 наиболее часто встречающихся вопросов на интервью для новичков в программировании на Java. Все это реальные вопросы на собеседовании Java Junior Developer.

Можно ли в Java переопределить статический метод?

Нет, статический метод в Java мы не можем переопределить. Мы можем только скрыть его.

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

Статический метод в Java не может быть переопределен по таким причинам:

  • Статические методы — это те, которые принадлежат непосредственно классу. Они не принадлежат объекту, и при переопределении объект решает, какой метод должен быть вызван.
  • Переопределение метода происходит динамически (во время выполнения), это означает, что определение того, какая версия метода будет использоваться происходит во время выполнения в соответствии с объектом, используемым для вызова, в то время как статические методы ищутся статически (во время компиляции).

Когда вы запустите программу выше, вы получите следующий результат:

Согласно правилам переопределения методов, вызов метода разрешается во время выполнения по типу object. Таким образом, в нашем примере выше d.hello (), во втором вызове, должен вызывать метод hello () класса DisplayMessage, поскольку ссылочная переменная класса Display ссылается на объект DisplayMessage, но вызывает hello () самого класса Display. Это происходит потому, что выполнение статического метода разрешается во время компиляции.

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

Можно ли выполнить перегрузку метода main() в Java?

Достаточно распространенный по языку Java вопрос на интервью.

Да, вы можете перегрузить метод main() в Java.

В Java можно выполнить перегрузку метода main(), но когда мы запустим нашу программу, JVM будет искать общедоступный статический void main (String [] args) и выполнит этот метод.

Перегрузка метода main() в Java:

Когда вы запустите программу выше, вы получите такой результат:

Видно, что метод main() у нас перегружен, но все же JVM вызывает метод с подписью public static void main (String [] args).

Обратите внимание, что JVM считает var args public static void main (String. args) таким же, как public static void main (String [] args).

Если мы хотим вызвать именно перегруженный метод, то вам нужно вызвать его из метода main с сигнатурой public static void main (String [] args).

Когда вы запустите программу выше, вы получите такой результат:

Как видите, мы вызвали перегруженные методы из main() с помощью аргумента String [].

Можем ли мы в Java переопределить приватные методы?

В Java мы не можем переопределить private методы, так как они видны только классу-владельцу.

Каков базовый класс для всех классов в Java?

java.lang.Object — это базовый класс для всех объектов.

Можете ли вы перечислить некоторые важные методы из класса object?

Среди важных методов класса object выделяют:

  • hashcode — в качестве возвращаемого значения имеет хеш-значение объекта;
  • equals — сравнивает ссылки на объекты;
  • wait — текущий поток ожидает, пока не будет вызвано notify или notifyAll;
  • notify — пробуждает один поток, который ожидает блокировки;
  • notifyAll — пробуждает все потоки, ожидающие блокировки;
  • toString — обеспечивает представление объекта в виде строкового значения;
  • clone — этот метод применяется для клонирования объекта;
  • finalize — этот метод вызывается, когда объект подвергается обработке сборщиком мусора.

Какие два метода вам нужно переопределить при помещении пользовательского объекта в качестве ключа для HashMap?

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

В чем отличия в Java между HashMap и HashSet?

HashMap

В HashMap реализован интерфейс Map, который выполняет сопоставление некого ключа со значением. Он не синхронизирован и не является потокобезопасным. Не допускаются дублирующиеся ключи, а также null ключи и null значения.

HashSet

В HashSet реализован интерфейс Set, не допускающий дублирования значений. Он не синхронизирован и не является потокобезопасным.


Выше employeeSet будет иметь 2 элемента, так как Set не допускает повторяющихся значений.
Метод add применяется для добавления элементов в HashSet. Если этот метод возвращает true, тогда элемент добавляется успешно, но, если возвращается false – это значит, что вы пытаетесь вставить дублирующее значение.

Одна из главных особенностей HashSet — объекты, которые мы собираемся добавить в HashSet, должны реализовывать методы Hashcode() и equals(), чтобы мы могли проверять наличие дублирующихся значений. Если мы добавляем пользовательские объекты в HashSet, то мы должны переопределить методы Hashcode() и equals() в соответствии с нашими потребностями. Если HashMap и HashSet не будут переопределены, объект будет принимать реализацию по умолчанию, что может быть нежелательно.

Мастер Йода рекомендует:  164 крутых опенсорс проекта для новичков

HashMap vs HashSet:

Можем ли мы иметь абстрактный класс без какого-либо абстрактного метода в нем?

Да, вы можете иметь абстрактный класс без создания какого-либо абстрактного метода.

Что вы знаете о переменной с модификатором transient? Когда вы будете ее использовать?

Переменные с модификатором transient (нерезидент) применяются при сериализации.

Если вы не хотите делать сериализуемую переменную, вы можете сделать ее переменной с модификатором transient.

Transient переменная — это переменная, значение которой не будет сериализоваться во время сериализации объекта. А при десериализации — вы получите значение по умолчанию для этих переменных.

Допустим, у вас есть класс Country, и вы не хотите сериализовать атрибут населения, поскольку он будет меняться со временем, поэтому вы можете объявить атрибут населения как transient, и он больше не будет сериализован.

Можете ли вы вызвать метод start() дважды в Java?

Нет, вы не можете вызвать метод start() дважды. Это вызовет llegalStateException.

После того как поток был запущен, он не может быть запущен снова. Если вы попытаетесь снова запустить поток, он выдаст исключение IllegalThreadStateException

Давайте разберемся с помощью примера:

Когда вы запустите программу выше, вы получите такой результат:

Как вы можете видеть, когда мы пытались запустить поток во второй раз, он вызывал исключение IllegalThreadStateException.

Если вы попытаетесь снова запустить поток, он выдаст исключение IllegalThreadStateException

Почему String неизменяемый (immutable) в Java?

В Java класс String неизменяемый. Если вы возьмете словарное значение слова «immutable», это означает, что он не может быть изменен с течением времени, соответственно строка не может быть изменена в Java.

Давайте разберемся с примером.

Как видите, значение str1 не изменилось. Она создала другой объект String со значением «Hellojava2blog», но не изменил String str1.

Это объясняет, что String является неизменяемым по своей природе.
Теперь давайте разберемся, каковы потенциальные причины сделать String неизменной в Java.

Пул строк:

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

Потокобезопасность:

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

Безопасность:

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

Хэш-значение кэша:

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

Загрузка классов:

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

Знаете ли вы, как сделать класс неизменным (immutable)? Можете ли вы предоставить шаги для этого?

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

Неизменяемый класс очень прост для понимания, он имеет только одно состояние.

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

Неизменяемые объекты по умолчанию являются потокобезопасными.

Шаги для создания неизменяемого класса:

  • Финализируйте свой класс:

Если вы финализируете свой класс — ни один класс не сможет его расширить, следовательно, не сможет переопределить методы этого класса.

  • Пометьте все переменные класса модификаторами доступа private и final:

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

  • Скажите «нет» методам-мутаторам:

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

  • Выполните клонирование изменяемых объектов при возврате из метода получения:

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

Можем ли мы иметь статический метод в интерфейсе?

Да, у нас может быть статический метод в интерфейсе из Java 8.

Можете ли вы объявить конструктор финальным (final)?

Нет, вы не можете объявить конструктор финальным.

В чем разница между StringBuffer и StringBuilder?

Что такое Java ClassPath?

ClassPath — это переменная окружения, которую виртуальная машина Java (JVM) использует для определения местоположения всех классов, используемых программой.
Например: jre / lib / rt.jar имеет все классы Java, и вам также необходимо включить файлы jar или файл классов, которые используются программой.

У вас есть список пользовательских объектов? Как вы можете их отсортировать?

Вам необходимо использовать интерфейс Comparable или Comparator для сортировки списка пользовательских объектов.

Что такое модификатор volatile в Java?

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

Назовите два разных способа вызвать сборщик мусора?

System.gc() или Runtime.getRuntime().gc().

Что такое маркерный интерфейс в Java? Можете ли вы привести несколько примеров маркерного интерфейса?

Маркерные интерфейсы — это те интерфейсы, которые не содержат в себе никаких методов и полей.
Примерами интерфейсов маркеров являются: Serializable, Cloneable, Remote.

Сколько объектов будет создано ниже:

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

Можете ли вы провести различие между проверяемым исключением (Checked Exception) и непроверяемым исключением (Unchecked Exceptions)?

Что такое исключение?


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

Что такое проверяемое исключение?

Проверяемые исключения — это те исключения, которые проверяются при компиляции. Если вы не обработаете их, вы получите ошибку компиляции.

Используя блок try и catch вы можете поместить код ошибки в блок try и перехватить исключение в блоке catch.

Что такое непроверяемое исключение?

Непроверяемые исключения — это те исключения, которые не проверяются во время компиляции. Java VM не будет «ругаться», если вы не обработаете такие исключения.

Если вы выполните код выше вы получите:

В чем разница между ArrayList и LinkedList? Как вы решите, какой из них вам нужно использовать?

Один из распространенных вопросов интервью: «В чем разница между ArrayList и LinkedList». Прежде чем мы действительно увидим различия, давайте кратко рассмотрим оба.

ArrayList:

  • ArrayList – является реализацией интерфейса List.
  • ArrayList не синхронизирован (поэтому не является потокобезопасным).
  • ArrayList реализован с использованием массива в качестве внутренней структуры данных. Его можно динамически изменять.

LinkedList:

  • LinkedList является реализацией интерфейса List и интерфейса Deque.
  • LinkedList не синхронизируется.
  • LinkedList реализован с использованием двусвязного списка в качестве внутренней структуры данных.

Свойство

ArrayList

LinkedList

Внутренняя структура данных

Использует динамический массив для хранения элементов внутри.

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

Если нам нужно вставить или удалить элемент в ArrayList, это может занять O(n), так как он использует массив, и нам может потребоваться сместить элементы в случае вставки или удаления.

Если нам нужно вставить или удалить элемент в связанном списке, это займет O(1), так как он внутренне использует двусвязный список.

В ArrayList поиск выполняется быстрее, т.к. он использует массив, основанный на индексах. Сложность — O(1).

Поиск в LinkedList идет медленнее, т.к. он использует двусвязанный список. Сложность равна O(n).

ArrayList реализует только интерфейс List, поэтому его можно использовать только как List.

LinkedList реализует интерфейсы List, Deque, поэтому его можно использовать как List, Stack или Queue.

Когда использовать ArrayList и LinkedList?

Это на самом деле зависит от нашей потребности.
Если нам требуется произвести большое количество вставок или удалений, то нам следует использовать LinkedList. Если у нас имеется мало вставок или удалений, но выполняется много поисковых операций, то тогда нам следует использовать ArrayList.

В чем разница между wait и sleep в Java?

Один из распространенных вопросов на интервью Java разработчика: «В чем разница между wait и sleep в Java?». Прежде чем мы действительно увидим различия, кратко ознакомимся с обоими.

sleep vs wait:

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

Вы можете использовать Java Thread Join() для достижения этого сценария.

Без использования метода Join:

Когда вы запускаете программу выше, вы получите следующий результат:

С помощью метода Join:

Когда вы запустите программу выше, вы получите следующий результат:

Как видите, основной поток завершается последним в этом сценарии.

Итоги

Мы с вами рассмотрели 25 распространенных вопросов на собеседовании на должность Junior Java Developer.

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

Собеседование на java-программиста (java-developer interview). Часть 2: Вопросы

Это продолжение цикла статей о собеседовании на java-программиста:

Java-related технологии и фреймворки рождаются и умирают, а без знания java core далеко не уедешь. Как можно знать Hibernate, но не знать JDBC и SQL? Как можно разбираться в Spring MVC или Struts, но при это плавать в сервлетах? Как можно пользоваться блокирующими очередями, экзекьюторами и локами, но при этом не понимать, как работают wait/notify? Для меня это до сих пор остается загадкой.

С другой стороны, меня иногда удивляют вопросы сотрудников, которые они задают кандидатам. Зачем спрашивать о Vector и Hashtable — на дворе уже скоро 4-ое тысячелетие. Или «зачем нужен UNION»? Так и хочется ответить — для SQL-инъекций. На счет паттернов проектирования и UML я вообще молчу — неужели до сих пор не наигрались? Но это еще полбеды. Иногда интервьюеры сами допускают довольно грубые ошибки. Об этом чуть позже.

Ниже приведен список вопросов (точнее небольшая его часть), которые я задаю на собеседовании, с моими комментариями. Вся прелесть в том, что в зависимости от позиции (junior java developer, mid-level, senior developer) и специализации некоторые из вопросов превращаются в более короткие либо более продолжительные диалоги с кандидатом и проверяют не только технические знания, но и умение мыслить и делать логические умозаключения. После многих пунктов вы найдете ссылки на статьи по соответствующей тематике.

[Disclamer: В статье выражается до безобразия субъективное мнение. Резкие выражения используются исключительно для донесения своих мыслей до читателя: никого обижать я не собирался и не собираюсь. Людям с расшатанной психикой или зашкаливающим ЧСВ читать, и тем более комментировать, категорически воспрещается. К спамерам и троллям это не относится: каждый ваш комментарий как лучик света в этом царстве тьмы, и дай вам бог всем здоровьечка.]

Вопросы собеседования по Core Java

Для позиций типа Senior эти вопросы можно пропустить. Но иногда все же стоит перестраховаться.

1. Модификаторы в Java.

Особо глубоко спрашивать не нужно — вкратце о назначении и вариантах использования. Можно спросить о контекстах использования этих модификаторов (класс/поле/метод). Подробные вопросы о модификаторах доступа, расширении модификаторов при наследовании, переопределение и сокрытие методов, модификатор abstract и final для классов/методов лучше оставить для вопросов по ООП в Java. Подробное знание модификаторов synchronized и volatile можно проверить в вопросах по многопоточности.

Небольшая статья про модификаторы — здесь.

2. Иерархия коллекций в Java.

Рассматриваем Collection, Set, List, Queue, Map и их основные реализации. Можно в принципе спросить о методах, которые есть в интерфейсе Collection, но лучше не надо. Стоит поинтересоваться, какими коллекциями человек пользовался, но опять же без фанатизма. Напоминаю, Vector и Hashtable (и Stack кстати тоже) — прошлый век, тем более в случае работы с legacy кодом всегда можно посмотреть сорцы. Еще можно поговорить о массивах, а следующий код может привести к интересному диалогу:

По поводу свойств и контракта equals/hashCode спросить стоит и о поломке коллекций тоже, но сильно не увлекайтесь, так как это может привести к любимому вопросу большинства интервьюеров об устройстве HashMap. В свою очередь это напрямую ведет нас к вопросам о структурах данных, алгоритмах и их сложности. Мое мнение по этому поводу — с алгоритмами хорошо знакомы олимпиадники и те, у кого в университете это преподавалось на должном уровне. Мне, например, в этом плане не повезло ни с тем, ни с другим. И разбирался в алгоритмах/АТД по ходу своей работы только тогда, когда возникали соответствующие задачи или просто было время и желание почитать и осознать. В результате — quick sort, merge sort, radix sort напишу; hash map, linked list, binary search tree напишу; semaphore, thread pool, blocking queue тоже напишу. Что-то еще нужно? Окей, напишу.

Что делать, если шило все же мешает и хочется хоть раз в жизни показать свои глубочайшие знания в области алгоритмов и структур данных и без того напуганному кандидату. Начнем с того, что такие вопросы стоит задавать только senior разработчику и только если задачи такого плана встречаются на проекте достаточно часто (что встречается достаточно редко). Так уж и быть, спрашивайте об устройстве HashMap и скорости поиска, об устройстве LinkedList и сложности операций над ним. Можно попросить, чтобы человек своими словами рассказал, откуда в quick/merge sort берется log2n. Можно еще какую-нибудь задачу алгоритмическую задать. Но помните, возможно с этим человеком вам еще придется работать в одной команде.

3. Иерархия исключений и ошибок.

Тут как бы все понятно, но бывает, что люди не знают элементарных вещей. Стоит спросить об иерархии, о checked и unchecked ошибках/исключениях, когда используются те или иные, как и когда их нужно обрабатывать. Можно даже начать небольшой диалог по поводу OutOfMemoryError. Если человек знаком с JDBC, можно поговорить об SQLException и поинтересоваться, оно chekced или unchecked и нормально ли это по мнению кандидата.

Ответ на этот вопрос можно найти здесь

4. Вложенные классы в Java.

Некоторые считают, что этот вопрос не нужен. Лично я так не думаю. Стоит спросить о классификации, вариантах использования, о нарушении инкапсуляции и самое интересное — зачем они нужны по мнению кандидата.

Моя статья о вложенных классах на Quizful — здесь.

И статья об анонимных классах — здесь.


Вопросы по ООП в Java

5. Основы ООП

Здесь уже подробно рассматриваем модификаторы доступа и прочие вещи, которые я упомянул в комментариях к первому вопросу. Можно спросить об интерфейсах и абстрактных классах. Пусть человек своими словами расскажет о полиморфизме и инкапсуляции. Если хотите послушать рассуждения человека, можно спросить о таком фрагменте кода:

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

6. Паттерны проектирования

Напоминаю, не стоит глубоко спрашивать о паттернах проектирования. И ни в коем случае не поучайте кандидата рассказами о том, «насколько они полезные» и «как их правильно реализовывать». Кстати, по поводу красоты/понятности кода и быстроты его написания мой друг говорит следующее: «Чтобы уметь круто хачить на Java, нужно дохера хачить на Java».

Каталог паттернов проектирования можете найти здесь

Вопросы собеседования по многопоточности в Java

7. Многопоточность в Java.

Хочу посвятить этой теме цикл статей: одним абзацом не отделаешься. Если вкратце, спросите, зачем нужна многопоточность, что такое монитор объекта, спросите о модификаторах syhcnronized и volatile, методах wait/notify/notifyAll, а так же о пакете java.util.concurrent. А следующий фрагмент кода должен привести к достаточно интересному разговору:

Интересная статья про методы wait/notify доступна здесь.

Вопросы, связанные с базами данных

8. SQL

Для начала стоит задавать вопросы по ANSI SQL. Далее, в зависимости от СУБД, используемой на проекте, можно спрашивать о важных отличиях ее диалекта. Итак, пусть человек расскажет об основных элементах баз данных — таблицах, процедурах, функциях, констрейнтах и т.д. О констрейнтах можно поспрашивать чуть подробнее. Стоит поинтересоваться, как человек понимает null в базах данных. Переходите к агрегатным функциям и о том, как они работают с null, не забудьте о group by и having. Можно дать пару маленьких задачек на эту тему (см. задачи 1-2 ниже). Поспрашивайте о типах join и дайте пару задачек (см. задачи 3-4 ниже).

Задача 1. Дана таблица T с колонкой A целого типа, содержащая значения 10, 20, 30, null. Чему будут равны результаты выражений «AVG(A)» и «SUM(A) / COUNT(*)»?

Задача 2. Дана таблица T с колонкой A целого типа. Напишите запрос, который вернет все положительные значения встречающиеся в таблице более одного раза.

Задача 3. Даны таблицы T1 и T2. В каждой есть колонка A целого типа. Значения в первой таблице — 1, 2, а во второй — 2, 3. Что вернут запросы с inner join, left/right/full outer join и cross join вида «select T1.A, T2.A from T1 . join T2 on T1.A = T2.A».

Задча 4. Даны 2 таблицы с колонками A целого типа. Напишите запрос, который вернет все значения колонки А из первой таблицы, для которой нет соответствия в колонке A второй.

Статья о конструкции Join доступна здесь

9. JDBC API

Тут тоже без особых извращений. Спросите о Connection, Statement, PreparedStatement, CallableStatement, ResulSet, зачем каждая из этих сущностей нужна. Можно поинтересоваться о том, чем они являются: абстрактными классамм, конкретными классами или интерфейсами и почему.

Еще вопросы — как создать соединение в JDBC, каким образом лучше добавлять большое количество записей в таблицу, ну и обязательно о транзакциях и autocommit. Чуть не забыл — вопрос об уровнях изоляции транзакций считаю как минимум странным — в следующий раз, когда решите его задавать, вспомните, сколько раз с уровнями изоляции сталкивались лично вы.

Читайте на блоге подробный туториал по JDBC.

Вопросы собеседования по веб-программированию

10. Servlet API

Для начала надо спросить об HTTP в целом. Что такое хедеры запроса, какие вообще типы запросов бывают, что такое HTTP Status Code.

Далее нужно спросить про класс HttpServlet, в каком виде можно работать с запросом и ответом. Что такое сессия (HttpSession) и как ее получить. Не забудьте спросить про ServletFilter и варианты их использования.

Организм требует сна. Статью завершу через некоторое время. Удачи всем.

Какие вопросы по Java Collection вы задаете (или вам задавали) на собеседовании?

После нескольких интересных собеседованиям, набрал список «постоянных» вопрос по коллекциям. Хочу поинтересоваться, что еще из распространенных вопросов пропустил? Вот мой список (авторская постановка вопросов оставлена, так что прошу не писать некорректный вопрос:-):

Иерархия коллекций.
Чем отличается ArrayList от LinkedList?
Что вы обычно используете (ArrayList или LinkedList)? Почему?
Что быстрее работает ArrayList или LinkedList?
Как происходит удаление элементов из ArrayList? Как меняется в этом случае размер ArrayList?
Предложите эффективный алгоритм удаления нескольких элементов из середины списка, реализуемого ArrayList.
Необходимо добавить 1млн. элемент, какую структуру вы используете?

Как устроена HashMap?
Какое начальное количество корзин в HashMap?
Какая оценка временной сложности выборки элемента из HashMap?
Гарантирует ли HashMap указанную сложность выборки элемента?
Роль equals и hashCode в HashMap?
Максимальное число значений hashCode()?
Как и когда происходит увеличение количества корзин в HashMap?

Что такое set?
TreeSet и HashSet? Отличия?
Устройство TreeSet?
Что будет, если добавлять элементы в TreeSet по возрастанию?

  • Вопрос задан более трёх лет назад
  • 9076 просмотров

Какие-то ну уж слишком несложные и ожидаемые вопросы для серьёзного собеседования.

з.ы. каков смысл такого поста?

1. Если только вставка и вы знаете сколько то ArrayList-у можно «дать совет» о размере(на самом деле он предвыделит место) Метод ensureCapacity
Если не использовать этот метод то вопрос спорный, у linkedList-а большие(в сравнении с ArrayList) накладные расходы, а arrayList будет копировать элементы, выделяя при этом память и фрагментируя ее. Но учетное количество копировании будет 3/2 от размера массива, потому я всеже думаю что ArrayList(кстати то что константа 3/2 забита прямо в код — очень плохое свойство стандартного ArrayList)

2. универсальное хеширование никак не связано с с enum-ом. Но его построение предполагает возможность использовать сколь-угодно большие числа. В тьюринг-полном языке java есть все 😉 но речь шла о конкретной коллекции, ключем к которой вы можете сделать что угодно, и у него есть метод hashcode который возвращает int. Если все элементы коллекции вернут одно и тоже то будет O(n) какую бы стратегию не использовать.

3. уверен что асимптотически одинаково.
конкретное число может быть в константу отличаться даже между версиями jvm, потому что гарантия предоставляемая jvm именно
This implementation provides guaranteed log(n) time cost for the containsKey , get, put and remove operations. И ничего более.

Вопросы для собеседования javascript разработчика

Как пройти собеседование js junior разработчику? Что учить? Все здесь!

Собеседование

Первая часть: без воды

  1. Список вопросов по основам (с указанием ссылок на материалы)
  2. Список вопросов по react/redux (с указанием ответов и ссылок)

Вторая часть (невозможно без воды)

  1. Цель собеседования
  2. Про обратную связь
  3. Общие советы
  4. Полезные материалы

Не забывайте, что в группе проводятся разборы тестовых заданий.

На вебинаре были слегка затронуты middle и team-lead, так же разобраны вопросы «из зала».

Список вопросов по основам

  • прицнипы ООП (хороший эффект производит знание трех слов: инкапсуляция, наследование, полиморфизм)
  • типы данных javascript
  • что такое свойство объекта, а что метод
  • написать функцию, add, чтобы вызов add(1)(2) вернул 3 (замыкания)
  • армия функций
  • кофеварка (один раз написать самому, подсматривая в учебник обязательно)
  • знать, что объекты передаются по ссылке
  • как сделать debounce функцию [EN]
  • map, filter, reduce
  • xhr и как его отменить (легко: abort), современный вариант fetch (с отменой все так себе)
  • promise

Список вопросов по React/Redux

Вопросы скопированы из моего ответа на toster.ru

Ответы предоставлены для подписчиков vk группы — Обучение «Без воды». Приходите, научим. Имеется telegram канал.


React

Самые «тяжелые» операции в web — работа с DOM. Реакт оптимизирует эту работу. Как? Virtual DOM + обновление страницы за минимум «телодвижений».

Мгновенно ли срабатывает setState ? Если нет, то как выполнить код, который 100% выполнится после того, как новый state будет установлен?

setState (документация) — асинхронная функция. Чтобы выполнить, что-либо заведомо после обновления state, нужно использовать запись с callback’ом

Так же, чтобы обновить состояние, основываясь на предыдущее, подойдет следующая запись:

Совет: чтобы быть в курсе подобных вещей, нужно либо читать документацию, либо читать/смотреть какие-то последовательные курсы. Данные знания — фундаментальные, их должен осветить любой уважающий себя автор.

Зачем многие постоянно пишут в constructor: this.FUNCTION_NAME = this.FUNCTION_NAME.bind(this) и отсюда вопрос вытекает чему равно this в разных местах вашего компонента…

«Биндинг» чего-либо, это привязка к контексту. То есть, когда вы находитесь в конструкторе, this ссылается на компонент. Следовательно, если какой-то из методов «прибиндить» (привязать) к this, то он всегда будет иметь внутри себя this ссылающийся на компонент. Так делается, в частности из-за того, чтобы не терять контекст this, когда идет запись не через «жирную arrow функцию».

Для решения через «жирную arrow функцию», требуется плагин transform-class-properties (входит по умолчанию в create-react-app)

в каких методах жизненного цикла стоит выполнять xhr запросы? В каких стоит «обновлять state на основе props«?

Xhr (ajax, асинхронные запросы) — нужно выполнять в момент componentDidMount

Обновление state, на основе props:

Что будет если вызвать this.setState в render методе компонента?

Будут проблемы. Реакт перерисовывает компонент, если state изменился. setState === ситуации «стейт изменился», а «реакт перерисовывает компонент» === render метод. Получается, что будет циклическая перерисовка.

Зачем нужен componenWIllUnmount , приведите пример

CWU подходит для «приборки». Например, у вас есть компонент, который реагирует на onsize (изменение размеров) страницы. Затем вы планируете перейти куда-то, где этого компонента нет. Он будет (will) «размонтирован» (unmount), значит в этот момент нужно снять «слушателя» на ресайз, так как он вам более не нужен.

Контролируемые, не контролируемые компоненты

Не маленький вопрос. Суть: если input не имеет onChange обработчика и value , то он неконтролируемый. Можно сделать ссылку на него с помощью ref . Таким образом, на сабмит формы, можно будет считать данные из инпутов, практически так же, как это делалось бы с нативным DOM. В чем смысл «неконтролируемого инпута»? Такое поведение может заметно сократить количество перерисовок компонента, куда этот input входит. Однако, если у вас обычная форма на несколько полей и более ничего в render тяжелого нет — все будет в порядке и с контролируемым инпутом (таким, в котором value смотрит на state/props и есть onChange)

Как организовать роутинг в реакт приложении?

Смотрим в window.location и на основе этого switch/case’ом выбираем какой компонент рисовать.

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

Зачем нужны propTypes ? Что происходит с ними в production сборке?

Затем, чтобы быстро ориентироваться какие свойства и какого типа (строка, функция и т.д.) ожидает компонент. Проверка propTypes достаточно затратная, поэтому она полностью убрана из production сборки самим реактом.

Сегодня, в 2020м году, на больших проектах propTypes уступают место flow (где, через babel plugin они так же описываются, но строже) или TypeScript‘у.

Как можно удобно «отлаживать» чужой код приложения, написанного на react (намек в сторону React devtools)

Хороший и легкий вопрос на «поболтать». Отладка с помощью console.log, debugger, react devtools, выносом кода компонента на чистый проект и тд тп. Вариантов масса.

Redux

Управление состоянием (данными) всего вашего приложения.

Зачем многие создают типы действий NAME_REQUEST / NAME_SUCCESS ? А заодно, что такое «действие», а что такое «создатель действия»…

Для асинхронных действий многие используют подход, в котором есть «имядействия + request (запрос) _или + success (успех) или + failure (ошибка)». Таким образом удобно обрабатывать случившиеся ситуации в редьюсере (например, показать/скрыть прелоадер, показать ошибку или результат). Конечно, «показывает» — компонент, а в редьюсере мы лишь устанавливаем данные.

Действие (action) — это простой объект с обязательным полем type и не обязательным payload (либо любым другим). Есть соглашение standard flux action (flux, потому что redux переосмыслил/развил идею flux).

Мастер Йода рекомендует:  Инструментарий Microsoft Edge DevTools представлен в виде Windows-приложения

Создатель действия (action creator) — это функция, которая возвращает действие.

Пример создателя действия:

Пример действия (напоминаю, это простой объект):

Что такое редьюсер? Можете написать простой редьюсер без react/redux?

Редьюсер, слово производное от функции reduce. Это такая «штука», которая принимает прошлое состояние и возвращает следующее.

По ссылке выше, так же есть пример reduce функции для подсчета суммы чисел.

Для чего нужен redux-thunk? Как он работает? Напишите (можно псевдокод) асинхронный создатель действия (либо, если надоело говорить «терминами» — асинхронный aciton)

Redux-thunk нужен для того, чтобы внутри создателя действия у вас была функция dispatch , чтобы с помощью нее «диспатчить» другие действия. Код redux-thunk’a состоит из 14 строк. Чтобы понимать как это работает, нужно знать как работают middleware.

Как компоненты приложения получают «пропсы» из «стора»?

Компоненты присоединены с помощью функции connect . А на самом верху живет redux компонент

. Provider умеет «прокидывать» пропсы вниз в потомков неявно. Используется старое API — context.

Можно ли (и считается ли это нормальным) использовать state, если используется Redux?

Разумеется да! Это нормально. Если изменяемое состояние компонента не нужно нигде, кроме него самого — это однозначно state.

Почему в reducer’ax мы возвращаем новые объекты? Приведите пример, когда вы возвращаете новый объект, а когда тот же самый.

Потому что redux использует простое сравнение: изменился объект или нет. А два объекта могут быть равны только в том случае, если они содержат ссылку на одно и тоже место в памяти. Следовательно, когда вы в старый объект записываете новое свойство, для redux это «тот же самый» объект и перерисовки не произойдет. Выше в вопросах про основы есть пункт «передача объектов по ссылке«, прочтите его если вам не понятен текст ответа.

Что возвращает функция connect (из react-redux)?

Connect возвращает новый компонент, обернутый в «приконекченный» компонент, в котором как раз и живут свойства, пришедшие из редьюсеров (которые туда любезно прокидывает Provider).

Общие вопросы

Вопросы в стиле: расскажите что это и для чего:

  • package.json
  • Webpack, gulp, и т.д.
  • node.js
  • promise (хороший материал, для тех кто уже хотя бы немного в теме).

Цель собеседования

Если вы стажер/junior и работу необходимо получить любой ценой, то соответственно цель «получить работу«. Когда такое необходимо?

  • у вас нет опыта совсем, но вам интересна тема IT, хочется узнать больше в целом
  • вы жестко привязаны к конкретному месту
    • к городу, непосредственно к месту проживания, и/или компании
  • повышать свои навыки
  • (если самому никак) соглашаться на то, что предлагают и терпеть.

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

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

  • бояться, что это последнее собеседование в жизни
  • брать на себя обязательства, которые многократно не под силу
    • но при этом, не бойтесь развития, то есть, некоторый лимит неизвестности и трудности — это в порядке вещей. Набивается опытом. А так же, можно честно сообщить сразу: к сожалению, большой экспертизы не имею, но уже не раз разбирался в подобном, только уровнем пониже.
  • необдуманно врать
  • соглашаться на любые условия
  • задавать вопросы, интересоваться
  • называть зарплату +20-30% от той, на которую вы рассчитываете (разумеется, необходимо заранее поинтересоваться зарплатной вилкой в вашем регионе). Вы либо станете участником торгов, и сторгуетесь до нужного уровня, либо получите бонус. Отказ тоже можно получить, но это слабый фактор для отказа (если речь идет именно про правильные цифры + разумный процент сверху).
  • попросить обратную связь


Про обратную связь

Если так вышло, что по собеседованию видно, что на вопросы вы ответили слабо, попросите сразу подсказать что необходимо почитать/изучить/подтянуть и какие источники порекомендуют, спросите когда можно прийти еще раз. Одна только такая фраза может обеспечить вам испытательный срок с урезанной ЗП.

Почему можно приходить еще раз? А почему нет! Если снова удастся пройти через фильтр в виде кадрового специалиста и попасть в кабинет на тех.собеседование, то это же круто! Вы уже знаете, какие вопросы были, как минимум их можно обозначить лучше. Хороший специалист задаст и другие, но скорее всего, если вы реально готовились — получится. Да и можно снова спросить — когда зайти еще. Это не шутки, так как многие города, действительно, выдают очень малое количество привлекательных рабочих мест. Можно и побороться!)

Тишина в эфире

Собеседование прошли, ТЗ сделали. Прошла неделя, в ответ ничего.

1) позвонить, поинтересоваться. Постараться получить обратную связь, это поможет стать лучше [1]

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

[1] иногда, на такие назойливые вопросы могут ответить отпиской или еще хуже — вариантом не в тему. Нельзя верить этому на слово. Если объективно вам кажется, что все было неплохо, но вы получили: вы не подходите нам по уровню, то опять рекомендую уточнить — что именно не так. Ответа скорее всего не будет, но попытка зачтена.

Очень часто может быть так: позицию уже закрыли (пришел кто-то лучше или знакомый, или решили не искать кандидата временно), а с вами то что делать? HR, вообще, уже про вас забыла и с легкой подачи она пишет: «Вашего уровня недостаточно». Для неуверенного джуна это удар.

  • очень скептически относится к тому, что говорят. Если по ощущениям в компании было интересно на собеседовании и вам ответили более менее подробно — скорее всего, стоит поблагодарить компанию и садиться учить. Иначе — нужно больше данных, то есть идем в следующую компанию.

Три собеседования — это абсолютный минимум для статистики.

Поставьте себя на место работодателя

Самый годный трюк. Представьте, что вы ищите работника. Кто вам нужен?

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

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

Так же, вы должны представить себя «неопытным/ленивым» рекрутером или занятым начальником. Тогда вам будет ясно, почему никаких ответов на ваш почтовый адрес не приходит. Кто-то забил, кому-то лень, кто-то забегался. Взяли другого.

— Как говорите вас зовут?

— А, спасибо, но вы нам не подходите <любая_причина>лишь бы не тратить на вас время.

Нет смысла обижаться или переставать верить в свои силы. Это глупо.

Общие советы

  1. Во время звонка HR, нужно выяснить, как проходит собеседование. Нужно ли писать код на бумаге, писать код на месте или сколько у собеседования этапов.
  2. День для собеседования желательно выбрать не «прямо сегодня», а чуть подальше: так у вас будет время подготовиться и, возможно, пообщаться с кем-то из компании / вычитать что-то про компанию в сети. Чем дольше вы сдвигаете срок, тем больше шансов, что перед вами кого-то уже возьмут. В реалиях маленького города (когда предложений очень мало) — нужно торопиться. В большом городе (предложений много / регулярно бывают) — скорее всего выслушают и предыдущего кандидата(ов) и вас.
  3. Повторить основы. Без идиотского заучивания задач на сравнение типов (список есть в начале статьи)

Зарплата

Специально не обсуждал эту тему, так как все можно найти на hh.ru для своего региона. Однако, есть еще пара полезных ссылок:

Полезные материалы

Сказ о том, как Катя попала в Яндекс.деньги + сразу комментарий про зарплату

Главное в статье:

Ничего сверхестевственного не требовали:

    уверенное знание javascript (замыкания, типы, наследование);

умение взаимодействовать с сервером (транспорты, модель OSI и REST API);

понимание браузерных процессов (загрузка ресурсов, парсинг кода и рендеринг).

Мое мнение про зарплату в известных компаниях (основано в том числе и на давних разговорах в офисе):

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

P.S. в свое время, на выставке E3 (про игры), у Half-Life 2 был очень скромный павильон, но народ, разумеется, шел туда толпами! Так же и с большими конторами: туда идут за опытом, за именем, но не за зарплатой (если речь про джуна/мидла).

Комментарий к статье про бестолковые задачи на собеседовании + сразу исправление опечатки от автора комментария

Краткая заметка о том, что многие программисты не могут написать метод сортировки пузырьком (и это нормально). Один из не знающих — создатель Ruby on rails.

Спорная статья на vc.ru (короткая, возможно реклама), но хорошо отражает следующие моменты:

  • да, специалисты могут сделать лучше ваше резюме
  • да, консультант может помочь вам с работой

В обоих случаях, как и в любой сфере, попасть на «специалиста» не просто. Результат не гарантирован.

Вопрос на тостере «Какие стратегии повышения зарплаты существуют» и ответ на него.

Стратегия проста — увеличивайте собственный профессиональный уровень на столько, чтобы свободно менять компанию, как только вас что-то перестало устраивать.

Про найм в Лабораторию Касперского (статья рекламная, но все же есть ответы на вопросы: что на собеседовании происходит и как. Речь про C++).

  • Как попасть в «Лабораторию Касперского» и чем заняться
  • О тестовых заданиях

Как всегда в комментариях присутствуют люди, которые либо хорошо в теме, либо «обиженные на жизнь», сказать кто есть кто — невозможно.

Авторский telegram канал «Пргрм с Козулей»

— Как вкатиться во фронтенд?

Научиться использовать поиск в гугле и Stack Oveflow. Остальное приложится с опытом. В интернете полно туторов, все уже разжевали по 100 раз и выплюнули для тех, кто умеет читать.

— Я уже какое-то время работаю, какой у меня уровень?

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

— Реакт или ангуляр?

Реакт. Я начинал с первой версии ангуляра и вторая не сильно лучше.

— Тайпскрипт или джаваскрипт?

ActionScript 3.0, там есть настоящая типизация. Тайпскрипт можно использовать для того, чтобы подглядеть API библиотек, но заткнуть им все дыры все равно не получится.

10 интересных вопросов по Java, которые вам могут задать на собеседовании

Ты не поверишь, какой ценный материал мне частенько подкидывают начинающие разработчики.

Один из таких — огромный список вопросов по Java, которые можно услышать на собеседовании, причем для всех уровней, Junior/Middle/Senior. Подтверждаю — мне частенько задавали эти вопросы, да и я сам, в роли интервьюера, их задавал.

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

Большое спасибо моему ученику @Alexander Metelchenko за предоставленный список.

Кстати, приличную часть этих вопросов покрывает email-курс JavaRanger и JavaEEHunter. Так же, это отличный инструмент проверить свои знания по JavaSE/EE, SQL и web.

Знаешь чем можно расширить этот список? Пиши в комментариях — я добавлю.

Интенсив Современная Java с Senior Разработчиками в эту субботу 28 января. Регистрируйся.

Оглавление:


Типы данных, переменные, операторы, циклы, массивы

  1. Сколько ключевых слов зарезервировано языком, что это за слова, какие из них не используются?
  2. Из каких символов может состоять имя переменной (корректный идентификатор)?
  3. Что значит слово «инициализация»?
  4. На какие основные группы можно поделить типы данных?
  5. Какие примитивные типы вы знаете? Назовите размерность в байтах для каждого типа.
  6. Что вы знаете о преобразовании примитивных типов данных, есть ли потеря данных, можно ли преобразовать логический тип?
  7. Какими значениями инициализируются переменные по умолчанию?
  8. Как передается значение переменной (по ссылке/значению)?
  9. Что вы знаете о функции main, какие обязательные условия ее определения?
  10. Какие логические операции и операторы вы знаете?
  11. В чем разница краткой и полной схемы записи логических операторов?
  12. Что такое таблица истинности?
  13. Что такое тернарный оператор выбора?
  14. Какие унарные операции вы знаете?
  15. Какая арифметическая операция выполняется при побитовом сдвиге вправо/влево?
  16. Какова роль и правила написания оператора выбора?
  17. Какие циклы вы знаете, в чем их отличия?
  18. Что такое «итерация цикла»?
  19. Какие параметры имеет цикл for, можно ли их не задать?
  20. Какой оператор используется для немедленной остановки цикла?
  21. Какой оператор используется для перехода к следующей итерации цикла?
  22. Что такое массив?
  23. Какие виды массивов вы знаете?
  24. Что вы знаете о классах оболочках?
  25. Что такое автоупаковка (boxing/unboxing)?

ООП (оглавление)

  1. Назовите принципы ООП и расскажите о каждом.
  2. Дайте определение понятию «класс».
  3. Что такое поле/атрибут класса?
  4. Как правильно организовать доступ к полям класса?
  5. Дайте определение понятию «конструктор».
  6. Чем отличаются конструкторы по-умолчанию, копирования и конструктор с параметрами?
  7. Какие модификации уровня доступа вы знаете, расскажите про каждый из них.
  8. Расскажите об особенностях класса с единственным закрытым (private) конструктором.
  9. О чем говорят ключевые слова «this», «super», где и как их можно использовать?
  10. Дайте определение понятию «метод».
  11. Что такое сигнатура метода?
  12. Какие методы называются перегруженными?
  13. Могут ли нестатические методы перегрузить статические?
  14. Расскажите о переопределение методов.
  15. Может ли метод принимать разное количество параметров (аргументы переменной длины)?
  16. Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода?
  17. Как получить доступ к переопределенным методам родительского класса?
  18. Какие преобразования называются нисходящими и восходящими?
  19. Чем отличается переопределение от перегрузки?
  20. Где можно инициилизировать статические/нестатические поля?
  21. Зачем нужен оператор instanceof?
  22. Зачем нужны и какие бывают блоки инициализации?
  23. Каков порядок вызова конструкторов и блоков инициализации двух классов: потомка и его предка?
  24. Где и для чего используется модификатор abstract?
  25. Можно ли объявить метод абстрактым и статическим одновременно?
  26. Что означает ключевое поле static?
  27. К каким конструкциям Java применим модификатор static?
  28. Что будет, если в static блоке кода возникнет исключительная ситуация?
  29. Можно ли перегрузить static метод?
  30. Что такое статический класс, какие особенности его использования?
  31. Какие особенности инициализации final static переменных?
  32. Как влияет модификатор static на класс/метод/поле?
  33. О чем говорит ключевое слово final?
  34. Дайте определение понятию «интерфейс».
  35. Какие модификаторы по умолчанию имеют поля и методы интерфейсов?
  36. Почему нельзя объявить метод интерфейса с модификатором final или static?
  37. Какие типы классов бывают в java (вложенные… и.т.д.)
  38. Что вы знаете о вложенных классах, зачем они используются? Классификация, варианты использования, о нарушении инкапсуляции.
  39. Каким образом из вложенного класса получить досуп к полю внешнего класса?
  40. Какие особенности создания вложенных классов: простых и статических.

  41. В чем разница вложенных и внутренних классов?
  42. Какие классы называются анонимными?
  43. Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли каке-нибудь ограничения для такой переменной?
  44. Как связан любой пользовательский класс с классом Object?
  45. Расскажите про каждый из методов класса Object.
  46. Что такое метод equals(). Чем он отличается от операции ==.
  47. Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
  48. Если equals() переопределен, есть ли какие-либо другие методы, которые следует переопределить?
  49. В чем особенность работы методов hashCode и equals? Каким образом реализованы методы hashCode и equals в классе Object? Какие правила и соглашения существуют для реализации этих методов? Когда они применяются?
  50. Какой метод возвращает строковое представление объекта?
  51. Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?
  52. Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode?
  53. Как вы думаете, будут ли какие-то проблемы, если у объекта, который используется в качестве ключа в hashMap изменится поле, которое участвует в определении hashCode?
  54. Чем отличается абстрактый класс о интерфейса, в каких случаях что вы будете использовать?
  55. Можно ли получить доступ к private переменным классам и если да, то каким образом?
  56. Модификаторы. Назначение и варианты использования.
  57. Что такое volatile и transient? Для чего и в каких случаях можно было бы использовать default?
  58. Контексты использования модификаторов (класс/поле/метод)
  59. Какой из модификаторов более строгий: protected или package-private?
  60. Расширение модификаторов при наследовании, переопределение и сокрытие методов. Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость? А если protected? А сузить видимость?
  61. Модификатор abstract и final для классов/методов
  62. Имеет ли смысл объявлять метод private final?
  63. Какие особенности инициализации final переменных?
  64. Что будет, если единственный конструктор класса объявлен как final?
  65. Расширение/сужение типов в аргументах переопределяемых методов в случае, если бы в Java список формальных параметров не входил бы в сигнатуру метода.
  66. Что такое finalize? Зачем он нужен? Что Вы можете рассказать о сборщике мусора и алгоритмах его работы.
  67. Почему метод clone объявлен как protected? Что необходимо для реализации клонирования?
  68. Знакомы ли Вам какие-либо паттерны проектирования?
  69. Напишите Singleton… А с ленивой загрузкой. А если он должен быть потоко-безопасным? А в каких случаях ленивая загрузка хуже?
  70. Что можете сказать про MVC? Нарисуйте диаграмму и объясните, как MVC работает.
  71. Напишите функцию вычисления факториала.
  72. Дана функция вычисления чисел Фибоначчи, известно, что она работает. Найдите логическую ошибку. Оцените сложность получившегося алгоритма.

Исключения (оглавление)

  1. Дайте определение понятию «исключение»
  2. Какова иерархия исключений.
  3. Можно/нужно ли обрабатывать ошибки jvm?
  4. Какие существуют способы обработки исключений?
  5. О чем говорит ключевое слово throws?
  6. В чем особенность блока finally? Всегда ли он исполняется?
  7. Может ли не быть ни одного блока catch при отлавливании исключений?
  8. Могли бы вы придумать ситуацию, когда блок finally не будет выполнен?
  9. Может ли один блок catch отлавливать несколько исключений (с одной и разных веток наследований)?
  10. Что вы знаете об обрабатываемых и не обрабатываемых (catched/uncatched) исключениях?
  11. В чем особенность RuntimeException?
  12. Как написать собственное («пользовательское») исключение? Какими мотивами вы будете руководствоваться при выборе типа исключения: checked/unchecked?
  13. Какой оператор позволяет принудительно выбросить исключение?
  14. Есть ли дополнительные условия к методу, который потенциально может выбросить исключение?
  15. Может ли метод main выбровить исключение во вне и если да, то где будет происходить обработка данного исключения?
  16. Если оператор return содержится и в блоке catch и в finally, какой из них «главнее»?
  17. OutOfMemoryError
  18. SQLException и поинтересоваться, оно chekced или unchecked и нормально ли это по мнению кандидата.
  19. Что такое Error? В каком случае используется Error. Приведите пример Error’а.
  20. Какая конструкция используется в Java для обработки исключений?
  21. Возможно ли использование блока try-finally (без catch)?
  22. Предположим, есть блок try-finally. В блоке try возникло исключение и выполнение переместилось в блок finally. В блоке finally тоже возникло исключение. Какое из двух исключений “выпадет” из блока try-finally? Что случится со вторым исключением?
  23. Предположим, есть метод, который может выбросить IOException и FileNotFoundException в какой оследовательности должны идти блоки catch? Сколько блоков catch будет выполнено?

Коллекции (оглавление)

  1. Дайте определение понятию «коллекция».
  2. Назовите преимущества использования коллекций.
  3. Какие данные могут хранить коллекции?
  4. Какова иерархия коллекций?
  5. Что вы знаете о коллекциях типа List?
  6. Что вы знаете о коллекциях типа Set?
  7. Что вы знаете о коллекциях типа Queue?
  8. Что вы знаете о коллекциях типа Map, в чем их принципиальное отличие?
  9. Назовите основные реализации List, Set, Map.
  10. Какие реализации SortedSet вы знаете и в чем их особенность?
  11. В чем отличия/сходства List и Set?
  12. Что разного/общего у классов ArrayList и LinkedList, когда лучше использовать ArrayList, а когда LinkedList?
  13. В каких случаях разумно использовать массив, а не ArrayList?
  14. Чем отличается ArrayList от Vector?
  15. Что вы знаете о реализации классов HashSet и TreeSet?
  16. Чем отличаются HashMap и TreeMap? Как они устроены и работают? Что со временем доступа к объектам, какие зависимости?
  17. Что такое Hashtable, чем она отличается от HashMap? На сегодняшний день она deprecated, как все-таки использовать нужную функциональность?
  18. Что будет, если в Map положить два значения с одинаковым ключем?
  19. Как задается порядок следования объектов в коллекции, как отсортировать коллекцию?
  20. Дайте определение понятию «итератор».
  21. Какую функциональность представляет класс Collections?
  22. В чем разница между HashMap и HashTable?
  23. Какой предок у класса HashTable?
  24. Как получить не модифицируемую коллекцию?
  25. Какие коллекции синхронизированы?
  26. Как получить синхронизированную коллекцию из не синхронизированной?
  27. Как получить коллекцию только для чтения?
  28. Почему Map не наследуется от Collection?
  29. В чем разница между Iterator и Enumeration?
  30. Как реализован цикл foreach?
  31. Почему нет метода iterator.add() чтобы добавить элементы в коллекцию?
  32. Почему в классе iterator нет метода для получения следующего элемента без передвижения курсора?
  33. В чем разница между Iterator и ListIterator?
  34. Какие естьспособы перебора всех элементов List?
  35. В чем разница между fail-safe и fail-fast свойствами?
  36. В каких случаях может быть выброшено ConcurrentModificationException?
  37. Что такое стек и очередь, расскажите в чем их отличия?
  38. В чем разница между интерфейсами Comparable и Comparator?
  39. Почему коллекции не наследуют интерфейсы Cloneable и Serializable?
  40. Какие алгоритмы сортировки Вам известны? Какие вообще знаете алгоритмы?
  41. Алгоритмы. Методы сортировки: quick sort, merge sort, radix sort; hash map, linked list, binary search tree; semaphore, thread pool, blocking queue
  42. Как посчитать среднее массива?
  43. Что быстрее, HashMap или TreeMap?

Строки (оглавление)

  1. Какие «строковые» классы вы знаете?
  2. Какие основные свойства «строковых» классов (их особенности)?
  3. Можно ли наследовать строковый тип, почему?
  4. Дайте определение понятию конкатенация строк.
  5. Как преобразовать строку в число?
  6. Как сравнить значение двух строк?
  7. Как перевернуть строку?
  8. Как работает сравнение двух строк?
  9. Как обрезать пробелы в конце строки?
  10. Как заменить символ в строке?
  11. Как получить часть строки?
  12. Дайте определение понятию «пул строк».
  13. Какой метод позволяет выделить подстроку в строке?
  14. Как разбить строку на подстроки по заданному разделителю?
  15. Какой метод вызывается для преобразования переменной в строку?
  16. Как узнать значение конкретного символа строки, знаю его порядковый номер в строке?
  17. Как найти необходимый символ в строке?
  18. Можно ли синхронизировать доступ к строке?
  19. Что делает метод intern()?
  20. Чем отличаются и что общего у классов String, StringBuffer и StringBuilder?
  21. Как правильно сравнить значения строк двух различных объектов типа String и StringBuffer?

Потоки ввода/вывода (оглавление)

  1. Какие существуют виды потоков ввода/вывода?
  2. Назовите основные предки потоков ввода/вывода.
  3. Что общего и чем отличаются следующие потоки: InputStream, OutputStream, Reader, Writer?
  4. Что вы знаете о RandomAccessFile?
  5. Какие есть режимы доступа к файлу?
  6. В каких пакетах лежат классы-потоки?
  7. Что вы знаете о классах-надстройках?
  8. Какой класс-надстройка позволяет читать данные из входного байтового потока в формате примитивных типов данных?
  9. Какой класс-надстройка позволяет ускорить чтение/запись за счет использования буфера?
  10. Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?
  11. Какой класс предназначен для работы с элементами файловой системы (ЭФС)?
  12. Какой символ является разделителем при указании пути к ЭФС?
  13. Как выбрать все ЭФС определенного каталога по критерию (например, с определенным расширением)?
  14. Что вы знаете об интерфейсе FileFilter?
  15. Что такое сериализация?
  16. Какие условия «благополучной» сериализации объекта?
  17. Какие классы позволяют архивировать объекты?

Потоки выполнения/многопоточность (оглавление)

  1. Дайте определение понятию «процесс».
  2. Дайте определение понятию «поток».
  3. Дайте определение понятию «синхронизация потоков».
  4. Как взаимодействуют программы, процессы и потоки?
  5. В каких случаях целесообразно создавать несколько потоков?
  6. Что может произойти если два потока будут выполнять один и тот же код в программе?
  7. Что вы знаете о главном потоке программы?
  8. Какие есть способы создания и запуска потоков?
  9. Какой метод запускает поток на выполнение?
  10. Какой метод описывает действие потока во время выполнения?
  11. Когда поток завершает свое выполнение?
  12. Как синхронизировать метод?
  13. Как принудительно остановить поток?
  14. Дайте определение понятию «поток-демон».
  15. Как создать поток-демон?
  16. Как получить текущий поток?
  17. Дайте определение понятию «монитор».
  18. Как приостановить выполнение потока?
  19. В каких состояниях может прибыватьпоток?
  20. Что является монитором при вызове нестатического и статического метода?
  21. Что является монитором при выполнении участка кода метода?
  22. Какие методы позволяют синхронизировать выполнение потоков?
  23. Какой метод переводит поток в режим ожидания?
  24. Какова функциональность методов notify и notifyAll?
  25. Что позволяет сделать метод join?
  26. Каковы условия вызова метода wait/notify?
  27. Дайте определение понятию «взаимная блокировка».
  28. Чем отличаются методы interrupt, interrupted, isInterrupted?
  29. В каком случае будет выброшено исключение InterruptedException, какие методы могут его выбросить?
  30. Модификаторы synchronized и volatile
  31. Пакет java.util.concurrent
  32. Какие вы знаете способы запустить некоторое действие в отдельном потоке?
  33. Какие вы знаете способы прекратить выполнение потока?
  34. Какие ключевые слова Java, связанные с многопоточностью Вы знаете?
  35. Есть некоторый метод, который исполняет операцию i++. Переменная i типа int. Предполагается, что код будет исполнятся в многопоточной среде. Следует ли синхронизировать блок?
  36. Что служит в качестве mutex, если метод объявлен synchronized?
  37. Можно ли вызвать в разных потоках два synchronized метода одного и того же объекта?
  38. Что используется в качестве mutex, если метод объявлен static synchronized? Можно ли создавать новые кземпляры класса, пока выполняется static synchronized метод?
  39. Объясните, что такое deadlock? Приведите пример кода, который демонстрирует deadlock.
  40. Какие особенности использования метода wait? При каких условиях поток может выйти из режима ожидания?
  41. Предположим в методе run возник RuntimeException, который не был пойман. Что случится с потоком? Есть ли способ узнать о том, что Exception произошел (не заключая все тело run в блок try-catch)? Есть ли способ восстановить работу потока после того как это произошло?
  42. Какие стандартные инструменты Java вы бы использовали для реализации пула потоков?

SQL, JDBC (оглавление)

  1. ANSI SQL
  2. Основные элементы баз данных — таблицы, процедуры, функции, констрейнты и т.д.
  3. Констрейнты: как вы понимаете null в базах данных.
  4. Агрегатные функции, как они работают с null. Не забудьте о group by и having
  5. JDBC: Connection, Statement, PreparedStatement, CallableStatement, ResulSet, зачем каждая из этих сущностей нужна. Чем они являются: абстрактными классамм, конкретными классами или интерфейсами и почему.
  6. Как создать соединение в JDBC?
  7. Каким образом лучше добавлять большое количество записей в таблицу?
  8. Транзакции и autocommit
  9. Что такое первая нормальная форма и процесс нормализации? Какие бывают нормальные формы?
  10. В чем смысл индекса СУБД, как они устроены, как хранятся? Как бы вы реализовали тот же функционал? Последний вопрос задают в случае, если нет четкого понимания индексов.
  11. Нарисуйте отношение Многие-ко-многим. Например: таблицы Авторы и Книги. У одного автора может быть несколько книг, и книга может быть написана несколькими авторами. Составьте SQL запрос на выборку книг определенного автора.

JSP (оглавление)

  1. Что такое jsp и зачем он нужен?
  2. Расскажите об этапах жизненного цикла jsp.
  3. Расскажите о методах жизненного цикла jsp.
  4. Как закомментировать код в jsp?
  5. Какие есть способы вставки java кода в jsp страницу?
  6. Почему не рекомендуется использовать скриптовые элементы в jsp?
  7. Какие неявные, внутренние объекты есть на jsp странице?
  8. Что вы знаете о PageContext?
  9. Как можно запретить использование скриптов и java кода на jsp странице?
  10. Что вы знаете о jsp тегах?
  11. Что вы знаете о языке выражений jsp (JSP Expression Language — EL)?
  12. Назовите неявные, внутренние объекты JSP EL и их отличия от объектов jsp.
  13. Как узнать http метод использую JSP EL?
  14. Что такое JSTL (Jsp Standard tag library)?
  15. На какие категории можно разделить JSTL теги, приведите примеры.
  16. Что вы знаете о написании пользовательских jsp тегов?
  17. Как можно обработать ошибки jsp страниц?
  18. Как происходит обработка ошибок с помощью jstl?
  19. Как деактивировать использование EL на JSP?
  20. Можно ли использовать javascript на jsp странице?
  21. Всегда ли создается объект сессии на jsp странице, можно ли отключить его создание?
  22. Как можно расширить функциональность jsp?
Мастер Йода рекомендует:  Как ограничить доступ к контенту незарегистрированным пользователям

Servlet (оглавление)

  1. Какова структура веб-проекта?
  2. Что такое сервлет?
  3. Что такое контейнер сервлетов?
  4. Каковы задачи, функциональность контейнера сервлетов?
  5. Что вы знаете о сервлет фильтрах?
  6. Зачем нужны слушатели в сервлетах?
  7. Когда вы будете использовать фильтры а когда слушатели?
  8. Как обработать исключения, выброшенные другим сервлетом в приложении?
  9. Что такое дискриптор развертывания?
  10. Как реализовать запуск сервлета с запуском приложения?
  11. Что представляет собой объект ServletConfig?
  12. Что представляет собой объект ServletContext?
  13. В чем отличия ServletContext и ServletConfig?
  14. Что такое Request Dispatcher?
  15. Как можно создать блокировку (deadlock) в сервлете?
  16. Как получить адрес сервлета на сервере?
  17. Как получить информацию о сервере с сервлета?
  18. Как получить ip адрес клиента на сервере?
  19. Что вы знаете о классах обертках (wrapper) для сервлетов?
  20. Каков жизненный цикл сервлета и когда какие методы вызываются?
  21. Какие методы необходимо определить при создании сервлетов?
  22. В каком случае вы будете переопределять метод service()?
  23. Есть ли смысл определить конструктор для сервлета, как лучше инициализировать данные?
  24. В чем отличия GenericServlet и HttpServlet?
  25. Как вызватьиз сервлета другой сервлет этого же и другого приложения?
  26. Что вы знаете и в чем отличия методов forward() и sendRedirect()?
  27. Стоит ли волноваться о «многопоточной безопасности» работая с сервлетами?
  28. Что такое servlet scope (область видимости — время жизни) и какие вы знаете?
  29. Что вы знаете и зачем нужны методы java.net.URLEncoder.encode() и decode()?
  30. Зачем нужны и чем отличаются методы encodeUrl() и encodeRedirectUrl()?

Web (оглавление)

  1. Что такое www?
  2. Что такое w3c?
  3. Что такое TCP/IP?
  4. Что такое ftp?
  5. Чем отличаются http и https?
  6. Что такое протокол передачи данных, какие вы знаете?
  7. Что такое web server?
  8. Что такое web приложение?
  9. Что такое application server?
  10. Чем отличаются web server и application server?
  11. Какие методы передачи данных вы знаете?
  12. Чем отличаются методы get и post?
  13. Что такое html?
  14. Что такое xml?
  15. Что такое css?
  16. Что такое MIME type?
  17. Что такое cookies?
  18. Что такое сессия?
  19. Дайте определение понятиям «авторизация» и «аутентификация», в чем их различия?
  20. Что такое Ajax? Как принципиально устроена эта технология?
  21. Что такое ORM, как это перевести и как это должно работать?

А ты знаешь ответы на все вопросы для Java Interview?

Как проходит JAVA собеседование? Ответы на многие вопросы тут!

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

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

Введение

Мы затронем версию Java 8, сначала будут освещены более базовые вопросы, а затем уже более продвинутые. Давайте начнем с самого начала и перейдем к основам.

Java собеседование: Основы

Вопрос 1: Что такое Java?

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

Java – это объектно-ориентированный, безопасный и высокоуровневый язык программирования. Он был создан и разработан еще в 1991 году человеком по имени Джеймс Гослинг. Язык Java разработан под слоганом «WORA» – «напиши один раз, запускай угодно» (write once, run anywhere). Он известен своей гибкостью и высокой эффективностью.

Вопрос 2: Является ли Java полноценно объектно-ориентированным языком?

Это вполне возможный вопрос на Java собеседование, и нет, он не полностью объектно-ориентирован. Java использует некоторые типы данных (char, byte, float), которые не являются объектами.

Вопрос 3: Назовите несколько преимуществ Java

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

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

Кроме того, Java полностью адаптируем. Благодаря принципу «WORA», на котором основан язык Java, его можно переносить и применять на любом компьютере и операционной системе, которые вам нужны, – он полностью гибкий и многофункциональный.

Вопрос 4: В чем особенность Java 8?

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

Java 8 представила языковую поддержку для String, предоставила улучшенный Date / Time API и способствовала разработке JVM – системы, отвечающей за многие вещи в Java, включая функции Java, отвечающие за безопасность. В целом, Java 8 сделала язык программирования более доступным и более похожим на современные языки программирования.

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

Вопрос 5: Что такое access specifiers в Java?

Всего есть четыре спецификатора доступа, про которые вас могут спросить на Java собеседование. Существуют следующие спецификаторы: public (публичные), private (частные), protected (защищенные) и default (стандартные).

Публичные спецификаторы разрешают доступ к любому классу или через любой метод (отсюда и их имя). В отличие от этого, частные спецификаторы разрешают доступ только внутри самого указанного класса. Защищенный открывает доступ, который каким-то образом коррелирует с классом – либо изнутри класса, из подкласса или просто из того же пакета. Наконец, default обозначает стандартную (по умолчанию) область и разрешает доступ только из одного пакета.

Вопрос 6: Что такое constructor?

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

Вопрос 7: Что такое Object?

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

Вопрос 8: В чем разница между ‘equals()’ и ‘==’?

public class Equaltest <
public static void main(String[] args) <
String str1= new String(“HELLO”);
String str2= new String(“HELLO”);
if(Str1 == str2)
<
System.out.println(«String 1 == String 2 is true»);
>
else
<
System.out.println(«String 1 == String 2 is false»);
String Str3 = Str2;
if( Str2 == Str3)
<
System.out.println(«String 2 == String 3 is true»);
>
else
<
System.out.println(«String 2 == String 3 is false»);
>
if(Str1.equals(str2))
<
System.out.println(«String 1 equals string 2 is true»);
>
else
<
System.out.prinltn(«String 1 equals string 2 is false»);
>
>>

Вопрос 9: Какие объектные отсылки могут быть в Java?

Из всех вопросов на Java собеседование этот вопрос один из самых простых – в Java все ссылки на объекты являются нулевыми.

Вопрос 10: В чем разница между JDK, JVM и JRE?

JDK (Java Development Kit) – это комплект разработки Java. Это основной инструмент функции Java, используемый для компиляции программ на этом языке. В пакете имеются все необходимые инструменты, чтобы начать его использовать.

Я уже упоминал JVM (Java Virtual Machine) ранее – это означает виртуальная машина Java. Это машина, которая создает среду, в которой байт-код Java обрабатывается должным образом.

JRE (Java Runtime Environment)- это среда выполнения Java. Это тип среды, предоставляемый JVM – он позволяет правильную работу байт-кода Java.

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

Продвинутые вопросы

Вопрос 1: В чем разница между ‘method overloading’ and ‘method overriding’?

Одним из первых возможных базовых вопросов на Java собеседование может быть этот. В случае с ‘method overloading’ (перегрузка методов) методы, принадлежащие к одному и тому же классу, имеют одно и то же имя, но их параметры отличаются. Это касается расширений поведения метода больше всего на свете. И наоборот, подклассы ‘method overriding’ (переопределения методов) имеют методы с одинаковыми именами и параметрами. Цель здесь – изменить поведение уже существующего метода.

Просто для примера, так выглядит ‘method overloading’:

class Adder <
Static int add(int x, int y)
<
return x+y;
>
Static double add( double x, double y)
<
return x+y;
>
public static void main(String args[])
<
System.out.println(Adder.add(33,33));
System.out.println(Adder.add(16.4,16.8));
>>

А это ‘method overriding’:

class Dog <
void run() <
System.out.println(“dog is sleeping”);
>
Class Doberman extends Dog <
void run()
<
System.out.prinltn(“doberman is sleeping at night”);
>
public static void main( String args[])
<
Dog b=new Doberman();
b.run();
>
>

Вопрос 2: Какой вывод у этой программы Java?

public class Test
<
Test(int x, int y)
<
System.out.println(«x = «+x+» y = «+y);
>
Test(int x, float y)
<
System.out.println(«x = «+x+» y = «+y);
>
public static void main (String args[])
<
byte x = 30;
byte y = 65;
Test test = new Test(x,y);
>
>

Правильный ответ выглядит так:

a = 30 b = 65

Вопрос 3: Возможно ли запустить программу без ‘main() method’?

Довольно стандартный вопрос на Java собеседование и да, это возможно. Одним из наиболее распространенных способов выполнения такой программы является использование static block (статического блока).

Вопрос 4: Что такое ‘runtime polymorphism’?

Runtime polymorphism – это процесс, в котором конкретный вызов, отправляемый по определенному методу, будет разрешен во время выполнения, а не во время компиляции. Вот пример:

class Tree <
void run()
<
System.out.println(“tree is standing”);
>
>
class Willow extends Tree <
void run()
<
System.out.prinltn(“willow is standing on a hill”);
>
public static void main(String args[])
<
Tree b= new Willow(); //upcasting
b.run();
>
>

Вопрос 5: Что такое ‘Inheritance’?

Этот термин, честно говоря, лежит на поверхности – Inheritance – это когда один объект приобретает свойства и параметры другого (другого класса). Обсуждаемый выше метод переопределения использует это. Основная идея наследования состоит в том, что вы можете создавать новые классы на уже существующих. Существует пять различных типов наследования, но язык программирования Java поддерживает только четыре (множественное наследование не поддерживается). Почему не поддерживается множественное наследование? На самом деле есть только одна конкретная причина – упростить программу. Это должно быть важным примечанием, о которых стоит помнить для Java собеседование.

Вопрос 6: Назовите самый большой класс (SuperClass) из существующих в Java

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

Вопрос 7: Что значит приставка Super в Java?

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

Вопрос 8: Какой будет результат выполнения этой программы?

class Animal
<
public Animal()
<
System.out.println(«Animal class constructor called»);
>
>
public class Zebra extends Animal
<
public Zebra()
<
System.out.println(«Zebra class constructor called»);
>
public static void main (String args[])
<
Zebra e = new Zebra();
>
>

Вот такое ответ:

Animal class constructor called
Zebra class constructor called

Это очень распространенные вопросы на Java собеседование. Всегда обращайте внимание на переменные – они определяют окончательный ответ.

Вопрос 9: Что такое ‘association’ в Java?

Один из наиболее часто задаваемых вопросов о Java-программировании, на первый взгляд может показаться, что он довольно простой. Однако такие вещи, как aggregation и composition, происходят из ассоциаций (association), поэтому важно понимать этот термин.

Ассоциация (association) – это когда все объекты имеют свои жизненные циклы, а конкретный владелец не существует. Оно может варьироваться от “one” до “many”.

Вопрос 10: Что такое ‘object cloning’?

Как вы уже заметили, многие из этих вопросов имеют ответ в своем названии. Этот не исключение.

Команда ‘object cloning’ (клонирование объекта) используется для создания идентичной копии объекта. Это делается с помощью метода clone () из класса объекта.

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

Подсказки для интервью

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

Даже не буду говорить, что надо выспаться и хорошо позавтракать – вы, наверное, слышали это уже по крайней мере тысячу раз. Я могу точно сказать, что вам не следует вставать в 3 утра, чтобы пересмотреть вопросы на Java собеседование, если вам назначили встречу на 8 утра. Старайтесь не думать об этом и ничего не делать за 24 часа до самого собеседования – бегло пересмотрите свои заметки по дороге на собеседование.

Кроме того, действуйте расслабленно, когда вы на собеседовании. Если работодатель видит, что вы нервничаете, он может подумать, что вы беспокоитесь, потому что у вас есть что скрывать – возможно, нехватка знаний? Не ведите себя глупо – найдите идеальный баланс между уверенностью в себе и свободой для импровизации.

И наконец, не думайте, что ваше интервью – это непреодолимая стена – вам не нужно отвечать на каждый вопрос идеально. Работодатели оценивают как ваши навыки, так и вашу личность во время собеседования. Лучше чего-то не понимать и вести себя естественно, чем притворяться и стараться выглядеть тем, кем вы не являетесь.

Заключение

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

Все, что вам осталось сделать – пройти собеседование и получить работу мечты!

Я надеюсь, что вас возьмут на ту самую вакансию!

10 интересных вопросов по Java, которые вам могут задать на собеседовании

Вопросы для собеседования на Java Developer

Потоки ввода/вывода в Java

Servlets, JSP, JSTL

  • © 2020 GitHub , Inc.
  • Terms
  • Privacy
  • Security
  • Status
  • Help

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Собеседование на java-программиста (java-developer interview). Часть 2: Вопросы

Это продолжение цикла статей о собеседовании на java-программиста:

Java-related технологии и фреймворки рождаются и умирают, а без знания java core далеко не уедешь. Как можно знать Hibernate, но не знать JDBC и SQL? Как можно разбираться в Spring MVC или Struts, но при это плавать в сервлетах? Как можно пользоваться блокирующими очередями, экзекьюторами и локами, но при этом не понимать, как работают wait/notify? Для меня это до сих пор остается загадкой.

С другой стороны, меня иногда удивляют вопросы сотрудников, которые они задают кандидатам. Зачем спрашивать о Vector и Hashtable — на дворе уже скоро 4-ое тысячелетие. Или «зачем нужен UNION»? Так и хочется ответить — для SQL-инъекций. На счет паттернов проектирования и UML я вообще молчу — неужели до сих пор не наигрались? Но это еще полбеды. Иногда интервьюеры сами допускают довольно грубые ошибки. Об этом чуть позже.

Ниже приведен список вопросов (точнее небольшая его часть), которые я задаю на собеседовании, с моими комментариями. Вся прелесть в том, что в зависимости от позиции (junior java developer, mid-level, senior developer) и специализации некоторые из вопросов превращаются в более короткие либо более продолжительные диалоги с кандидатом и проверяют не только технические знания, но и умение мыслить и делать логические умозаключения. После многих пунктов вы найдете ссылки на статьи по соответствующей тематике.

[Disclamer: В статье выражается до безобразия субъективное мнение. Резкие выражения используются исключительно для донесения своих мыслей до читателя: никого обижать я не собирался и не собираюсь. Людям с расшатанной психикой или зашкаливающим ЧСВ читать, и тем более комментировать, категорически воспрещается. К спамерам и троллям это не относится: каждый ваш комментарий как лучик света в этом царстве тьмы, и дай вам бог всем здоровьечка.]

Вопросы собеседования по Core Java

Для позиций типа Senior эти вопросы можно пропустить. Но иногда все же стоит перестраховаться.

1. Модификаторы в Java.

Особо глубоко спрашивать не нужно — вкратце о назначении и вариантах использования. Можно спросить о контекстах использования этих модификаторов (класс/поле/метод). Подробные вопросы о модификаторах доступа, расширении модификаторов при наследовании, переопределение и сокрытие методов, модификатор abstract и final для классов/методов лучше оставить для вопросов по ООП в Java. Подробное знание модификаторов synchronized и volatile можно проверить в вопросах по многопоточности.

Небольшая статья про модификаторы — здесь.

2. Иерархия коллекций в Java.

Рассматриваем Collection, Set, List, Queue, Map и их основные реализации. Можно в принципе спросить о методах, которые есть в интерфейсе Collection, но лучше не надо. Стоит поинтересоваться, какими коллекциями человек пользовался, но опять же без фанатизма. Напоминаю, Vector и Hashtable (и Stack кстати тоже) — прошлый век, тем более в случае работы с legacy кодом всегда можно посмотреть сорцы. Еще можно поговорить о массивах, а следующий код может привести к интересному диалогу:

По поводу свойств и контракта equals/hashCode спросить стоит и о поломке коллекций тоже, но сильно не увлекайтесь, так как это может привести к любимому вопросу большинства интервьюеров об устройстве HashMap. В свою очередь это напрямую ведет нас к вопросам о структурах данных, алгоритмах и их сложности. Мое мнение по этому поводу — с алгоритмами хорошо знакомы олимпиадники и те, у кого в университете это преподавалось на должном уровне. Мне, например, в этом плане не повезло ни с тем, ни с другим. И разбирался в алгоритмах/АТД по ходу своей работы только тогда, когда возникали соответствующие задачи или просто было время и желание почитать и осознать. В результате — quick sort, merge sort, radix sort напишу; hash map, linked list, binary search tree напишу; semaphore, thread pool, blocking queue тоже напишу. Что-то еще нужно? Окей, напишу.

Что делать, если шило все же мешает и хочется хоть раз в жизни показать свои глубочайшие знания в области алгоритмов и структур данных и без того напуганному кандидату. Начнем с того, что такие вопросы стоит задавать только senior разработчику и только если задачи такого плана встречаются на проекте достаточно часто (что встречается достаточно редко). Так уж и быть, спрашивайте об устройстве HashMap и скорости поиска, об устройстве LinkedList и сложности операций над ним. Можно попросить, чтобы человек своими словами рассказал, откуда в quick/merge sort берется log2n. Можно еще какую-нибудь задачу алгоритмическую задать. Но помните, возможно с этим человеком вам еще придется работать в одной команде.

3. Иерархия исключений и ошибок.

Тут как бы все понятно, но бывает, что люди не знают элементарных вещей. Стоит спросить об иерархии, о checked и unchecked ошибках/исключениях, когда используются те или иные, как и когда их нужно обрабатывать. Можно даже начать небольшой диалог по поводу OutOfMemoryError. Если человек знаком с JDBC, можно поговорить об SQLException и поинтересоваться, оно chekced или unchecked и нормально ли это по мнению кандидата.

Ответ на этот вопрос можно найти здесь

4. Вложенные классы в Java.

Некоторые считают, что этот вопрос не нужен. Лично я так не думаю. Стоит спросить о классификации, вариантах использования, о нарушении инкапсуляции и самое интересное — зачем они нужны по мнению кандидата.

Моя статья о вложенных классах на Quizful — здесь.

И статья об анонимных классах — здесь.

Вопросы по ООП в Java

5. Основы ООП

Здесь уже подробно рассматриваем модификаторы доступа и прочие вещи, которые я упомянул в комментариях к первому вопросу. Можно спросить об интерфейсах и абстрактных классах. Пусть человек своими словами расскажет о полиморфизме и инкапсуляции. Если хотите послушать рассуждения человека, можно спросить о таком фрагменте кода:

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

6. Паттерны проектирования

Напоминаю, не стоит глубоко спрашивать о паттернах проектирования. И ни в коем случае не поучайте кандидата рассказами о том, «насколько они полезные» и «как их правильно реализовывать». Кстати, по поводу красоты/понятности кода и быстроты его написания мой друг говорит следующее: «Чтобы уметь круто хачить на Java, нужно дохера хачить на Java».

Каталог паттернов проектирования можете найти здесь

Вопросы собеседования по многопоточности в Java

7. Многопоточность в Java.

Хочу посвятить этой теме цикл статей: одним абзацом не отделаешься. Если вкратце, спросите, зачем нужна многопоточность, что такое монитор объекта, спросите о модификаторах syhcnronized и volatile, методах wait/notify/notifyAll, а так же о пакете java.util.concurrent. А следующий фрагмент кода должен привести к достаточно интересному разговору:

Интересная статья про методы wait/notify доступна здесь.

Вопросы, связанные с базами данных

8. SQL

Для начала стоит задавать вопросы по ANSI SQL. Далее, в зависимости от СУБД, используемой на проекте, можно спрашивать о важных отличиях ее диалекта. Итак, пусть человек расскажет об основных элементах баз данных — таблицах, процедурах, функциях, констрейнтах и т.д. О констрейнтах можно поспрашивать чуть подробнее. Стоит поинтересоваться, как человек понимает null в базах данных. Переходите к агрегатным функциям и о том, как они работают с null, не забудьте о group by и having. Можно дать пару маленьких задачек на эту тему (см. задачи 1-2 ниже). Поспрашивайте о типах join и дайте пару задачек (см. задачи 3-4 ниже).

Задача 1. Дана таблица T с колонкой A целого типа, содержащая значения 10, 20, 30, null. Чему будут равны результаты выражений «AVG(A)» и «SUM(A) / COUNT(*)»?

Задача 2. Дана таблица T с колонкой A целого типа. Напишите запрос, который вернет все положительные значения встречающиеся в таблице более одного раза.

Задача 3. Даны таблицы T1 и T2. В каждой есть колонка A целого типа. Значения в первой таблице — 1, 2, а во второй — 2, 3. Что вернут запросы с inner join, left/right/full outer join и cross join вида «select T1.A, T2.A from T1 . join T2 on T1.A = T2.A».

Задча 4. Даны 2 таблицы с колонками A целого типа. Напишите запрос, который вернет все значения колонки А из первой таблицы, для которой нет соответствия в колонке A второй.

Статья о конструкции Join доступна здесь

9. JDBC API

Тут тоже без особых извращений. Спросите о Connection, Statement, PreparedStatement, CallableStatement, ResulSet, зачем каждая из этих сущностей нужна. Можно поинтересоваться о том, чем они являются: абстрактными классамм, конкретными классами или интерфейсами и почему.

Еще вопросы — как создать соединение в JDBC, каким образом лучше добавлять большое количество записей в таблицу, ну и обязательно о транзакциях и autocommit. Чуть не забыл — вопрос об уровнях изоляции транзакций считаю как минимум странным — в следующий раз, когда решите его задавать, вспомните, сколько раз с уровнями изоляции сталкивались лично вы.

Читайте на блоге подробный туториал по JDBC.

Вопросы собеседования по веб-программированию

10. Servlet API

Для начала надо спросить об HTTP в целом. Что такое хедеры запроса, какие вообще типы запросов бывают, что такое HTTP Status Code.

Далее нужно спросить про класс HttpServlet, в каком виде можно работать с запросом и ответом. Что такое сессия (HttpSession) и как ее получить. Не забудьте спросить про ServletFilter и варианты их использования.

Организм требует сна. Статью завершу через некоторое время. Удачи всем.

25 вопросов, которые задают на собеседовании JavaScript-разработчику

Доброго времени суток, дорогой гость! Рада приветствовать на страницах своего блога.

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

Мне бы хотелось выразить благодарность Senior Frontend Developer Греченок Евгению и Senior Backend Developer Гиззатову Марселю за помощь в создании статьи. Те вопросы, которые идут дальше, из их методички, которую они используют для собеседований кандидатов «и на 30 тысяч, и на 130». Большое спасибо, ребята, за время, которое мне уделили, и считаю, что для меня на собеседовании был хороший стимул убрать пробелы в собственных знаниях и сделать еще один шаг к тому, чтобы стать профессионалом.

Вопросы по JavaScript (синтаксис и особенности языка)

1. Если вам необходимо проверить, определено ли свойство у самого объекта … (hasOwnProperty)
2. Как работает this ( http://bonsaiden.github.io/JavaScript-Garden/ru/#function.this )
3. Замыкания ( http://bonsaiden.github.io/JavaScript-Garden/ru/#function.closures )
4. Определение переменных (всплытие)
5. Переменные let, const, var ( https://learn.javascript.ru/let-const )
6. Равенство и сравнение (оператор == и ===)
7. Операторы typeof и instanceof (для чего используются http://bonsaiden.github.io/JavaScript-Garden/ru/#types.instanceof )
8. Почему нельзя использовать eval ( http://bonsaiden.github.io/JavaScript-Garden/ru/#core.eval )
9. Деструктуризация ( https://learn.javascript.ru/destructuring )
10. Строки-шаблоны ( https://learn.javascript.ru/es-string )
11. Классы (прототипы, современные)
12. Итераторы ( https://learn.javascript.ru/iterator )
13. Генераторы ( https://learn.javascript.ru/generator )
14. Новые типы данных ( https://learn.javascript.ru/set-map )
15. Что такое Eventloop? Объясните принцип его работы.

Общие вопросы по программированию

  1. Отличие компилируемого языка от интерпретируемого
    Чем компиляция С отличается от Java
  2. Отличие статической типизации от динамической
  3. Отличие наследование от композиции ( https://habrahabr.ru/post/325478/ )
  4. Алгоритмы и их сложность (JS https://tproger.ru/translations/algorithms-and-data-structures/ )
    a. В приложении к любому языку привести примеры стандартных методов сортировки / обхода дерева / поиска в массиве, дикте с пояснением о их сложности и как работают.
  5. FIFO, LIFO
  6. Структуры данных (JS https://learn.javascript.ru/data-structures )
    a. Числа, Строки
    b. Объекты (ассоциативные массивы), передача по ссылке (что передаётся по значению)
    c. Массивы
    d. Деревья, Списки (связанный, ссылочный)
  7. Архитектура (в чём разница)
    a. асинхронная,
    b. многопоточная
  8. Микросервисы
    a. Будет ли микросервисами распределённая архитектура через общую шину данных
    b. Требования к микросервисам
    i. горизонтальное масштабирование
    ii. отказоустойчивость
  9. Преимущества микросервисов:
    i. легкая поддержка (небольшие сервисы легче)
    ii. нет ограничения на языки и библиотеки для решения задачи
    iii. упрощенное тестирование, возможность замокать взаимодействия
    iv. легкое накатывание и откатывание новых версий
    v. можно экспериментировать с технологиями

Гибкие методологии

  1. Зачем нужны
  2. Какие подходы есть
  3. Выявление проблем в разработке, зачем нужна ретроспектива в scrum
  4. Распределение задач по разработчикам
    • горят сроки
    • планирование

Задача на понимание JavaScript

Задача 1. Что выведет данный код?

Цель задачи: проверить понимание замыкания.

Тема: Замыкание (closure).

Ответ: Если исходить из определения замыкания — способность функции запоминать область видимости переменной, в которой та была объявлена, то правильный ответ 5. Функция a запомнила содержимое объявленной ранее переменной за пределами функции, и после вывода функции, передала в alert 5.

Добавить комментарий