Что спрашивают на собеседовании java
Перейти к содержимому

Что спрашивают на собеседовании java

  • автор:

250+ вопросов по Java для Junior, Middle, Senior

250+ вопросов по Java для Junior, Middle, Senior

24.02.2021

135680

Рейтинг: 5 . Проголосовало: 9
Вы проголосовали:
Для голосования нужно авторизироваться

advertisement advertisement

Дорогие друзья! Предлагаем вашему вниманию перевод статьи, опубликованной на DOU.ua 1 февраля 2021 года. Оригинальная версия на украинском языке доступна по ссылке

Редакция DOU.ua обратилась к СТО и опытным специалистам, которые проводят интервью по направлению Java, о том, какие теоретические вопросы задают и какие задачи и задания предлагают решить кандидатам. Ведь, готовясь к техническому собеседованию, важно иметь четкий план. На основе полученных ответов составлена эта подборка вопросов с градацией по уровню специалиста. Надеемся, этот список вопросов станет своеобразным путеводителем, который поможет получить желаемую должность.

Junior

Общие

1. Какие знаете шаблоны проектирования? Расскажите о двух шаблонах, которые использовали в работе.

Java Core

2. Какие есть типы данных в Java?

3. Чем отличается объект от примитивных типов данных?

4. В чем разница передачи параметров по ссылке и по значению?

5. Что такое JVM, JDK, JRE?

6. Зачем используют JVM?

7. Что такое bytecode?

8. Какие признаки JavaBean?

9. Что такое OutOfMemoryError?

10. Что такое стектрейс? Как его получить?

11. Назовите все методы класса object.

12. В чем отличие между try-with-resources и try-catch-finally при работе с ресурсами?

13. Что такое конструкторы? Какие типы знаете?

14. Что такое побитовые операции?

15. Объекты каких стандартных классов immutable в Java?

16. Дайте краткую характеристику immutable object. Зачем они нужны?

17. Как создать immutable object?

18. Какие преимущества immutable object перед обычными объектами?

Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Стартовый (урок 1, урок 2, урок 5), Java Базовый (урок 1, урок 2, урок 8, урок 9).

ООП

19. Что такое ООП? Назовите принципы с примерами.

20. В чем преимущества ООП перед процедурным программированием?

21. В чем заключается главная особенность ООП?

22. Расскажите, какие преимущества мы получаем при использовании ООП?

23. Расскажите, какие есть недостатки в ООП?

24. Расскажите о принципе наследования в ООП? Зачем он нужен?

25. Дайте определение принципа полиморфизма в ООП? Как работает полиморфизм?

advertisement advertisement

26. Что такое статический и динамический полиморфизм?

27. Дайте определение принципа абстракции в ООП.

28. Какие элементы языка отвечают за инкапсуляцию?

29. Какие элементы языка отвечают за наследование?

30. Какие элементы языка отвечают за полиморфизм?

31. Что такое SOLID? Приведите примеры.

32. Что такое перегрузки (overloading) метода?

33. Что такое переопределение (override) метода?

34. Что такое класс, объект, интерфейс?

35. Что такое класс POJO? Приведите пример такого класса.

36. Какие элементы могут содержать класс?

37. Дайте определение объекта.

38. Расскажите о наследовании в Java. Какие особенности использования ключевого слова super?

39. Что такое сигнатура метода? Приведите примеры правильных и неправильных сигнатур.

40. Можно ли в конструкторе применять return?

41. Можно ли в конструкторе выкинуть исключение (exception)?

42. Из каких элементов состоит заголовок класса? Напишите пример.

43. Из каких элементов состоит заголовок метода? Напишите пример.

44. Создайте в объекте-наследнике конструктор по умолчанию, если в базовом классе он не определен (но определен другой конструктор).

45. Когда применяется ключевое слово this?

46. Что такое инициализатор?

47. Для наследования класса public class Child extends Parent напишите порядок инициализации объекта.

48. Какие знаете отношения между классами (объектами)?

49. Какие ассоциативные связи между объектами вы знаете?

50. Что такое модификаторы доступа в Java? Назовите их. Для чего используются?

51. Назовите основную особенность статических переменных и методов.

52. Какие основные ограничения действуют на статические переменные и методы?

53. Что означает ключевое слово static? Может ли статический метод быть переопределенным или перегруженным?

54. Может ли метод быть статическим и абстрактным одновременно?

55. Можно ли использовать статические методы внутри обычных? Наоборот? Почему?

56. Что означает ключевое слово final?

57. Что такое abstract? Абстрактный класс? Абстрактный метод?

58. Что такое interface? Может ли быть final interface?

59. В чем разница между абстрактным классом и интерфейсом в Java?

60. Где можно инициализировать статические поля?

61. Что такое анонимные классы?

62. Что такое примитивные классы?

63. Что такое класс «обертка» (wrapper)?

64. Что такое Nested class? Когда используется?

65. Какие модификаторы доступа могут быть у класса?

Ответы на некоторые из этих вопросов вы можете найти в видео курсах Java Базовый (урок 1-4, урок 6, урок 7, урок 9), SOLID принципы в Java.

Библиотеки и стандарты

67. Что такое Hibernate? В чем разница между JPA i Hibernate?

68. Что такое каскадность? Как она используется в Hibernate?

69. Может ли entity-класс быть абстрактным классом?

70. Что такое entity manager? За что отвечает?

71. Что такое класс Assert? Зачем и как его использовать?

Ответы на некоторые из этих вопросов вы можете найти в видео курсе JDBC & Hibernate.

String

72. Дайте характеристику String в Java.

73. Какие есть способы создания объекта String? Где он создается?

Тема связана со специальностями:

74. Как сравнить две строки в Java и/или отсортировать их?

75. Предложите алгоритм преобразования строки в знак. Напишите соответствующий код.

76. Как превратить строку в массив байтов и обратно? Напишите соответствующий код.

77. Что такое строковый пул и зачем он нужен?

78. Какие GOF-шаблоны применяются в строковом пуле?

79. Как разделить строку на части? Напишите соответствующий код.

80. Почему массив символов лучше, чем строка для хранения пароля?

81. Какая разница между String, StringBuffer и StringBuilder?

Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 5).

Enum

82. Дайте краткую характеристику Enum в Java.

83. Может ли Enum реализовывать (implement) интерфейс?

84. Может ли Enum расширить (extends) класс?

85. Можно ли создать Enum без экземпляров объектов?

86. Можем ли мы переопределить метод toString() для Enum?

87. Что будет, если не будем переопределять метод toString() для Enum?

88. Можем ли мы указать конструктор внутри Enum?

89. В чем разница между == и equals()?

90. Что делает метод ordinal() в Enum?

91. Можно ли использовать Enum с TreeSet или TreeMap в Java?

92. Как связаны методы ordinal() и compareTo() в Enum?

93. Напишите пример Enum.

94. Можно ли использовать Enum в switch case?

95. Как получить все имеющиеся значения в экземпляре Enum?

Ответы на некоторые из этих вопросов вы можете найти в видео курсах Java Базовый (урок 7), Java Углублённый (Урок 3).

Stream API

96. Что такое Stream в Java?

97. Назовите основные свойства транзакций.

98. Какие есть уровни изоляции транзакций?

99. Какая разница между Statement и PreparedStatement?

Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 15).

Collections

100. Расскажите об итераторах и об их применении.

101. Какая иерархия коллекций в Java Collection Framework?

102. Какое внутреннее строение ArrayList?

103. Какое внутреннее строение LinkedList?

104. Какое внутреннее строение HashMap?

105. Чем отличается ArrayList от LinkedList?

106. Чем отличается ArrayList от HashSet?

107. Зачем в Java такое многообразие имплементации динамического массива?

108. Зачем в Java такое многообразие имплементации key-value storage?

109. Как отсортировать коллекцию элементов?

Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Базовый (урок 5), Java Углублённый (урок 3, урок 15).

Class Object. Equals and HashCode

110. Дайте краткую характеристику class object в Java.

111. Для чего используют Equals and HashCode в Java?

112. Расскажите о контракте между Equals and HashCode в Java?

113. Какие условия выдвигаются касательно переопределения соглашения при переопределении Equals?

114. Что будет, если не переопределить Equals and HashCode?

115. Какие значения мы получим, если у нас не перераспределены Equals and HashCode?

116. Почему симметричность выполняется, только если x.equals(y) возвращает true?

117. Что такое коллизия в HashCode? Как с ней бороться?

118. Что будет, если элемент, участвующий в контракте с HashCode, меняет свое значение?

119. Напишите методы Equals and HashCode для класса Student, который состоит из полей String name и int age.

120. В чем разница применения if (obj instanceof Student) и if (getClass() == obj.getClass())?

121. Дайте краткую характеристику метода clone().

122. В чем заключается особенность работы метода clone() с полями объекта типа-ссылки?

Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Базовый (урок 9).

Exceptions

123. Дайте определение понятию exception (исключительная ситуация).

124. Какие знаете особенности использования оператора try . catch?

125. В чем разница между error и exception?

126. Какая разница между checked и unchecked, exception, throw, throws.

127. Какой есть иерархия исключений?

128. Что такое checked и unchecked exception?

129. Нужно ли проверять checked exception?

130. О чем говорит и как использовать ключевое слово throws?

131. Какие возможные способы обработки исключений вы знаете?

132. Напишите пример перехвата и обработки исключения в блоке try-catch метода.

133. Напишите пример перехвата и обработки исключения в секции throws-метода и передачи вызывающему методу.

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

135. Какие есть правила для проверки исключений при наследовании?

136. Могли бы ли вы написать код, если блок finally не будет выполнен?

137. Напишите пример обработки нескольких исключений в одном блоке catch.

138. Какой оператор позволяет принудительно выбросить исключение? Напишите пример.

139. Может ли метод main выбросить throws-исключение? Если да — куда передаст?

140. Напишите пример try with resources.

Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Базовый (урок 8).

Многопоточность

141. Какие средства для работы с многопоточностью знаете?

142. Что такое процесс и поток? Чем отличается процесс от потока?

143. Расскажите о синхронизации между потоками. Для чего используют методы wait(), notify() — notifyAll(), join()?

144. Как остановить поток?

145. Как между потоками обмениваться данными?

146. В чем заключается отличие класса Thread от интерфейса Runnable?

147. Есть потоки Т1, Т2 и Т3. Как реализовать их последовательное выполнение?

Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 13, урок 14).

Практические задания

149. Move Zeroes (задача с Leetcode).

150. Дан List names. Удалите первую букву из каждого имени и верните отсортированный список.

151. Перевернуть массив.

152. Проверить, является ли строка палиндромом.

153. Написать простой алгоритм сортировки (Bubble, Selection или Shuttle). Как его можно улучшить?

154. Напишите алгоритм (последовательность действий) составления литерала типа int и литералов типа byte. Объясните, что происходит с памятью.

Middle

Общие

1. В чем преимущества и недостатки ООП, если сравнивать с процедурным/функциональным программированием?

2. Чем отличается агрегация от композиции?

3. Какие паттерны GoF вы использовали на практике? Приведите примеры.

Видео курсы по схожей тематике:

Разработка Web Services на платформе Java

Разработка Web Services на платформе Java

Unit тестирование в Java с JUnit

Unit тестирование в Java с JUnit

How to Java Стартовый

How to Java Стартовый

4. Что такое прокси-объект? Приведите примеры.

5. Какие нововведения анонсировано в Java 8?

6. Что такое High Cohesion и Low Coupling? Приведите примеры.

Лучше всего тема шаблонов в Java раскрыта в видео курсе Паттерны проектирования в Java.

ООП

7. Каким образом можно реализовать множественное наследование в Java?

8. Какая разница между методами final, finally и finalize()?

Java Core

9. В чем разница между статическим и динамическим связыванием в Java?

10. Можно ли использовать private или protected переменные в interface?

11. Что такое Classloader и для чего используется?

12. Что такое Run-Time Data Areas?

13. Что такое immutable object?

14. В чем особенность класса String?

15. Что такое ковариантность типов?

16. Какие есть методы в классе Object?

17. Приведите примеры удачного и неудачного использования Optional.

18. Можно ли объявлять main method как final?

19. Можно ли импортировать те же самые package/class дважды? Какие последствия?

20. Что такое Casting? Когда можем получить исключение ClassCastException?

21. Почему современные фреймворки используют в основном только unchecked exceptions?

22. Что такое static import?

23. Какая связь между методами hashCode() и equals()?

24. Когда используют BufferedInputStream и BufferedOutputStream классы?

25. Какая разница между классами java.util.Collection и java.util.Collections?

26. Какая разница между Enumeration и Iterator?

27. В чем разница между итераторами fail-fast и fail-safe?

28. Зачем нужен модификатор transient?

29. Как влияют на сериализацию модификаторы static и final?

30. Какие особенности использования интерфейса Cloneable?

31. Какие особенности использования интерфейса AutoCloseable?

32. Что такое FunctionInterface и чем он отличается от обычного интерфейса?

33. Что такое Atomic types и зачем они нужны?

34. Что такое Happens-before? Какие особенности использования ключевого слова volatile?

35. Расскажите о Heap и Stack память в Java. В чем разница между ними? Где хранятся примитивы?

36. Чем отличается stack от heap памяти? Когда и какая область памяти резервируется? Зачем такое разделение нужно?

37. Какие принципы работы и области памяти Garbage Collector?

38. Как работает Garbage Collector? Расскажите о Reference counting и Tracing.

39. Расскажите о механизме работы autoboxing в Java.

40. Как реализована сериализация в Java? Где мы можем ее увидеть?

41. Расскажите, в чем разница между WeakReference и SoftReference?

42. Что такое generics? Для чего они нужны? Какую проблему решают?

43. Что такое PECS и как используется? Приведите примеры.

44. Зачем на практике могут понадобиться immutable объекты?

Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Базовый и Java Углублённый.

Библиотеки и инструменты

45. Чем полезны инструменты Maven, Ant, Gradle?

46. Что такое Unit Tests? Чем класс JUnit.Assert отличается от ключевого слова assert?

47. Что такое и зачем нужен Spring core? Раскройте понятие Inversion of Control и Dependency Injection.

48. Как «под капотом» работает @Transactional?

49. Как «под капотом» работает Spring?

50. Что такое и зачем нужен Hibernate? Раскройте понятие ORM.

51. Что такое и когда возникает LazyLoadingException?

52. Как «под капотом» работает Hibernate? Как бы вы написали собственный Hibernate?

Ответы на некоторые из этих вопросов вы можете найти в видео курсах JDBC & Hibernate, Unit тестирование в Java с JUnit, Spring, Spring MVC.

Многопоточность

53. Какие преимущества и недостатки использования многопоточности?

54. Расскажите о четырех способах работы со многими потоками и чем отличается wait . notify . notifyAll от synchronized? От Future?

55. Что такое и зачем нужен ThreadLocal?

56. В чем разница между Thread.sleep() и Thread.yield()?

57. Как работает Thread.join()?

58. Что такое deadlock?

59. Что такое race condition?

60. Для чего использовать volatile, synchronized, transient, native?

61. Расскажите о приоритетах потоков.

62. Что такое потоки-демоны и для чего их устанавливать?

63. Почему нежелательно использовать Thread.stop()?

64. Как реализовать пул потоков?

Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 13, урок 14).

Collections

65. Чем отличается List от Set?

66. В чем разница между HashSet, LinkedHashSet и TreeSet?

67. Какая внутренняя структура HashMap?

68. Какое время поиска элемента в ArrayList, HashSet?

69. Как реализовать свой Stack?

70. Как работает метод put в HashMap? Почему нам нужно высчитывать позицию бакета? В чем преимущества такой операции?

71. В чем разница между HashMap и TreeMap? Когда и где их нужно использовать?

72. Какое внутреннее строение TreeMap? Рассказать об RBT.

Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 1, урок 2, урок 3).

Stream API

73. Какие есть методы в интерфейсе Stream?

74. Чем отличается метод map от flatMap?

75. Какой функциональный интерфейс использует метод filter?

Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 15).

Базы данных

76. В чем разница между реляционными и нереляционными базами данных?

77. Как хранятся соотношения one-to-one, one-to-many и many-to-many в виде таблиц?

78. Что такое нормализация БД? Приведите примеры из реального проекта.

79. Какие есть виды индексов в БД?

Ответы на некоторые из этих вопросов вы можете найти в видео курсе SQL Базовый.

Практические задания

82. Дано String s, найти длину максимального substring без повтора символов.

83. Определить, является ли односвязный LinkedList палиндромом.

Senior

Общие

1. Когда лучше использовать наследование, а не агрегацию?

2. Расскажите о принципах работы Kubernetes.

Java Core

3. В чем разница между Java NIO и Java IO?

4. Чем отличается Lambda от анонимного класса?

5. Расскажите о Java Memory Model.

6. Какие есть типы памяти в JVM?

7. Опишите жизненный цикл Java-объекта. Каким образом объект переходит из одной области памяти Garbage Collector в другую? Что является триггером такого перехода?

8. Каким образом можно заставить JVM запустить Garbage Collector?

9. Какие существуют Garbage Collectors в JVM и зачем их столько?

10. Какие виды Garbage Collector есть в HotSpot? Как работают?

11. Что будет с Garbage Collector, если finalize() будет долго выполняться или в процессе выполнения получим исключение?

12. Чем ForkJoinPool отличается от ScheduledThreadPoolExecutor и ThreadPoolExecutor?

13. Какая разница между HashMap, WeakHashMap, Hashtable, IdentityHashMap?

14. Что такое LinkedHashMap?

15. Что такое EnumSet? Для чего использовать? Как реализовать?

16. Расскажите об особенностях сериализации в Java. Зачем serialVersionUID и InvalidClassException?

17. В чем проблема сериализации Singleton?

18. Какие бывают алгоритмы обхода деревьев и почему они разные?

19. Что такое deadlock? Какие типы существуют? Нарисуйте схематично, как может произойти.

Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Базовый и Java Углублённый.

Бесплатные вебинары по схожей тематике:

Типичные ошибки в коде на примере С++, С# и Java.

Типичные ошибки в коде на примере С++, С# и Java.

10 ключевых ошибок во время собеседования

10 ключевых ошибок во время собеседования

Первоапрельские соревнования по программированию на C#, Java, C++, Pascal

Первоапрельские соревнования по программированию на C#, Java, C++, Pascal

Базы данных

20. Что такое ACID?

21. Что означает CAP-теорема?

22. Какие есть уровни изоляции транзакций?

23. Есть ли смысл отказываться от использования ORM?

24. Что такое n+1 проблема?

25. Что такое cartesian product проблема?

Библиотеки и инструменты

26. Каким образом построить monitoring в Java? Расскажите об особенностях использования Java micrometrics или DropWizard, или Prometheus frameworks.

27. Опишите механизм работы ORM.

28. Какие способы выборки данных в Hibernate вы знаете?

29. Какие изоляции транзакций существуют в Hibernate?

Spring

30. Что такое IoC и DI?

31. Каков жизненный цикл объектов, которые создает Spring?

32. Какие есть виды контекстов?

33. Как создать и поднять контекст с целью тестирования приложения?

34. Какие возможности Spring предоставляет для коммуникации с базой данных?

35. Какие признаки того, что класс — Java Bean? Чем POJO отличается от Java Bean?

36. Опишите механизм инъекции зависимости в Spring.

37. Почему все зависимости Spring являются Java Beans? Возможно ли использовать Spring для управления зависимостями между не Java Beans классами?

38. Чем Spring singleton отличается от prototype?

39. Есть ли смысл отказываться от использования Dependency Injection?

Ответы на некоторые из этих вопросов вы можете найти в видео курсах Spring, Spring MVC.

Многопоточность

40. Что такое race-condition?

41. Какие элементы есть в java.util.concurrent пакете?

42. Что такое optimistic и pessimistic locking?

43. Какие особенности многопоточности в Java EE и Spring?

Stream API

44. Какие основные принципы Stream API?

Практические задания

45. Реализовать сервис, который на вход принимает url и возвращает короткую версию (вроде bit.ly/86gfr3).

Редакция DOU.ua благодарит за помощь в подготовке статьи Александра Редька, Антона Наумова, Богдана Чупика, Максима Ляшенко, Александра Навка, Сергея Маленко, Андрея Петрика, Сергея Громового, Дениса Душина, Ивана Чуба.

Как пройти собеседование на позицию Java-разработчика

Логотип компании КРОК

Расскажем, как проходит собеседование у Java-разработчика, что ищут работодатели. И разберём вопросы и задачи, которые могут попасться.

Аватарка эксперта Евгений Войнов

Евгений Войнов
Руководитель группы, Senior Java-разработчик

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

Как проходит собеседование

Собеседование Java-разработчика я делю на несколько частей.

1. Задаю вопросы по языку. Например, попрошу сравнить ArrayList и LinkedList — но не по сложности операций, которую уже заучили многие, а по расходу памяти, если последовательно в каждую из коллекций в цикле поместить миллион элементов. Также даю задачки по разным темам.

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

Посмотреть ответ

Остаток от деления хэш-кода на текущее число корзин.

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

2. Узнаю про предыдущий опыт и проекты. Часто спрашиваю про последнюю сложную задачу, которую удалось решить: в чём была её сложность; какие решения рассматривал соискатель; по каким критериям сравнивал варианты решения и почему выбрал тот или иной вариант; доволен ли выбором спустя время и так далее. Параллельно смотрю на резюме. Обращаю внимание на то, какие фреймворки и решения в нём указаны, насколько уверенно человек про них говорит. Важно, чтобы он показал логическое, аналитическое мышление, мог подробно разобрать задачи, над которыми работал.

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

4. Рассказываю про проект, на который ищу сотрудника: в какой стадии он находится, какой у него стек технологий, какая команда уже собрана, по каким методологиям в ней ведётся работа и так далее.

5. Отвечаю на вопросы соискателя, если они есть. Часто разработчики спрашивают, какое у компании отношение к работе в офисе и на удалёнке, насколько жёсткие рамки рабочего дня.

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

Что важно знать стажёру

Когда проводишь собеседование со стажёром, самое важное — понять, насколько он созрел для стажировки:

  • какие у него профессиональные цели;
  • насколько серьёзно относится к будущей работе;
  • сколько времени он готов уделять ей и как будет совмещать с учёбой;
  • понимает ли, как строится карьера разработчика.

Хорошо, если человек уже продумал, как он организует свои будни, чтобы находить 30 часов в неделю на выполнение задач по проекту.

Вопросы по hard skills не особо сложные: иерархия коллекций в стандартной библиотеке, каково внутреннее устройство списков, множеств и хэш-таблиц, как оценить сложность алгоритма.

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

Также стажёрам я даю прорешать задачки на программирование: выдаю четыре задачи:

  • разминочная, чтобы познакомиться с платформой;
  • две — средней сложности;
  • четвёртая — «со звёздочкой».

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

Как пройти собеседование на позицию Java-разработчика 1

Обычно мы рассматриваем кандидатов, которые решили от двух задач, обращаем внимание на качество кода и использованные возможности языка. Потренироваться в решении таких задач можно на https://leetcode.com/ или https://www.codingame.com/ (особенно люблю режим пятиминутных батлов — Clash of Code).

Для студентов мы проводим Летнюю школу по разработке, а также зимний курс Java. Их выпускникам мы обычно не даём задачи, потому что уже понимаем, на что способны потенциальные стажёры.

Что важно знать джуну

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

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

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

Что важно знать мидлу

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

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

Посмотреть решение

В формулировке задачи, по сути, уже есть алгоритм решения. Но важно то, какие уточняющие вопросы задаст кандидат:
— формат параметров с клиента;— где лежат исходные файлы и в каком формате, какое распределение размера файлов;— с какой скоростью важно формировать ответ;
— сколько параллельно может быть таких обращений;
— какие в проекте используются библиотеки для работы с pdf или какие потребуется выбрать.
Если соискатель претендует на более высокий грейд (у нас это старший разработчик), то здорово добавить к размышлению то, как предполагается оценивать работоспособность решения, какие тесты предполагается разработать, что важно логировать для упрощения анализа нештатных ситуаций после внедрения на прод, какими могут быть инфраструктурные ограничения.

Кроме того, на собеседовании я спрашиваю про сложные возможности языка: многопоточность, возможности фреймворка Spring, его принципы (проксирование, работа с транзакциями, аспекты и так далее).

Что важно знать сеньору

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

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

Посмотреть решение

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

Идеального решения нет. Можно предложить найти компромисс, более подробно объяснить стажёру задачи, их влияние на проект и важность для профессионального развития или предложить другой проект.

Критично — понять, что человек готов проявлять эмпатию к стажёру и гибкость. И умеет глубоко копать в мотивы человека, учитывать интересы команды, проекта и компании.

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

Как я стал техническим менеджером после 18 лет в разработке

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

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

Что нужно, чтобы подготовиться к собеседованию на позицию Java-разработчика

  • Больше узнать о компании, в которую вы устраиваетесь: люди с какими навыками и качествами в ней требуются, как проходят собеседования, с кем предстоит общаться.
  • Вспомнить проекты с предыдущих мест работы: в чём они заключались, какие задачи вы в них решали — и как. Мне всегда важно слышать, что человек делал, какие принимал решения и каким был результат, как он его оценивает.
  • Прочитать одну из базовых книг по Java: Кей С. Хорстманн, Гари Корнелл «Java. Библиотека профессионала», Джошуа Блох «Java. Эффективное программирование».
  • Прочитать материалы по подготовке к сертификации Oracle Foundations Associate.
  • Посмотреть лекции Евгения Борисова по Spring и пройти несколько гайдов на spring.io.
  • Для старших разработчиков — прочитать пару книг, например, «Микросервисы. Паттерны разработки и рефакторинга» Криса Ричардсона или знаменитую книгу с кабанчиком.
  • Также для них — посмотреть материалы по прохождению дизайн-интервью. Десятка должно хватить, чтобы понять, как строить рассуждения, когда тебя просят на словах спроектировать систему.

Топ-50 Java Core вопросов и ответов на собеседовании. Часть 1

Java-университет

Топ-50 Java Core вопросов и ответов на собеседовании. Часть 1 - 1

Всем привет, дамы и господа Software Engineers! Давайте поговорим о вопросах на собеседовании. О том, к чему нужно готовиться и что нужно знать. Это отличный повод для того, чтобы повторить или же изучить с нуля эти моменты. У меня получилась довольно объемная подборка часто задаваемых вопросов об ООП, Java Syntax, исключениях в Java, коллекциях и многопоточности, которую для удобства я разобью на несколько частей. Важно: мы будем говорить только о версии Java до 8. Все нововведения с 9, 10, 11, 12, 13 не будут учитываться здесь. Любые идеи/замечания, как улучшить ответы, приветствуются . Приятного прочтения, поехали!

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

1. Какие особенности есть у Java?

  1. ООП концепты:
    1. объектная ориентированность;
    2. наследование;
    3. инкапсуляция;
    4. полиморфизм;
    5. абстракция.

    2. Что такое наследование?

    Под наследованием подразумевается, что один класс может наследовать(» extends «) другой класс. Таким образом можно переиспользовать код с класса, от которого наследуются. Существующий класс известен как superclass , а создаваемый — subclass . Также еще говорят parent и child .

     public class Animal < private int age; >public class Dog extends Animal

    где Animal — это parent , а Dog — child .

    3. Что такое инкапсуляция?

    Такой вопрос часто встречается на собеседовании Java-разработчика. Инкапсуляция — это сокрытие реализации при помощи модификаторов доступа, при помощи геттеров и сеттеров. Это делается для того, чтобы закрыть доступ для внешнего использования в тех местах, где разработчики считают нужным. Доступный пример из жизни — это автомобиль. У нас нет прямого доступа к работе двигателя. Для нас работа заключается в том, чтобы вставить ключ в зажигание и включить двигатель. А какие уже процессы будут происходить под капотом — не наше дело. Даже более того, наше вмешательство в эту деятельность может привести к непредсказуемой ситуации, из-за которой можно и машину сломать, и себе навредить. Ровно то же самое происходит и в программировании. Хорошо описано в википедии. Статья об инкапсуляции есть и на JavaRush.

    4. Что такое полиморфизм?

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

     List animals = Arrays.asList(new Cat(), new Dog(), new Cat()); animals.forEach(animal -> animal.makeSound()); 

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

    Вопросы на собеседовании — Java Syntax

    5. Что такое конструктор в Java?

    1. Когда новый объект создается, программа использует для этого соответствующий конструктор.
    2. Конструктор похож на метод. Его особенность заключается в том, что нет возвращающего элемента (в том числе и void), а его имя совпадает с именем класса.
    3. Если не пишется никакого конструктора явно, пустой конструктор будет создан автоматически.
    4. Конструктор может быть переопределен.
    5. Если был создан конструктор с параметрами, а нужен еще и без параметров, его нужно писать отдельно, так как он не создается автоматически.

    6. Какие два класса не наследуются от Object?

    Не ведитесь на провокации, нет таких классов: все классы прямо или через предков наследуются от класса Object!

    7. Что такое Local Variable?

    Еще один из популярных вопросов на собеседовании Java-разработчика. Local variable — это переменная, которая определена внутри метода и существует вплоть до того момента, пока выполняется этот метод. Как только выполнение закончится, локальная переменная перестанет существовать. Вот программа, которая использует локальную переменную helloMessage в методе main():

     public static void main(String[] args)

    8. Что такое Instance Variable?

    Instance Variable — переменная, которая определена внутри класса, и она существует вплоть до того момента, пока существует объект. Пример — класс Bee, в котором есть две переменные nectarCapacity и maxNectarCapacity:

     public class Bee < /** * Current nectar capacity */ private double nectarCapacity; /** * Maximal nectar that can take bee. */ private double maxNectarCapacity = 20.0; . >

    9. Что такое модификаторы доступа?

    Топ-50 Java Core вопросов и ответов на собеседовании. Часть 1 - 2

    Модификаторы доступа — это инструмент, при помощи которого можно настроить доступ к классам, методам и переменным. Бывают следующие модификаторы, упорядоченные в порядке повышения доступа:

    1. private — используется для методов, полей и конструкторов. Уровень доступа — только класс, внутри которого он объявлен.
    2. package-private(default) — может использоваться для классов. Доступ только в конкретном пакете (package), в котором объявлен класс, метод, переменная, конструктор.
    3. protected — такой же доступ, как и package-private + для тех классов, которые наследуются от класса с модификатором protected .
    4. public — используется и для классов. Полноценный доступ во всем приложении.

    10. Что такое переопределение (overriding) методов?

    • сигнатура метода должна быть такая же;
    • возвращаемое значение должно быть таким же.

    11. Что такое сигнатура метода?

    Топ-50 Java Core вопросов и ответов на собеседовании. Часть 1 - 3

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

    12. Что такое перегрузка методов?

    • одно и то же имя метода;
    • разные аргументы;
    • может быть разный возвращаемый тип.
    • add(Object o) — просто добавляет объект;
    • add(int index, Object o) — добавляет объект в определенный индекс;
    • add(Collection c) — добавляет список объектов;
    • add(int index, Collection c) — добавляет список объектов, начиная с определенного индекса.

    13. Что такое Interface?

    Множественное наследование не реализовано в джаве, поэтому чтобы преодолеть эту проблему, были добавлены интерфейсы в том виде, в котором мы их знаем 😉 Долгое время у интерфейсов были только методы без их реализации. В рамках этого ответа поговорим именно о них. Например:

     public interface Animal
    • все методы в интерфейсе — публичные и абстрактные;
    • все переменные — public static final;
    • классы не наследуют их (extends), реализовывают (implements). Причем реализовывать можно сколь угодно много интерфейсов.
    • классы, которые реализуют интерфейс, должны предоставить реализацию всех методов, которые есть в интерфейсе.
     public class Cat implements Animal < public void makeSound() < // реализация метода >public void eat() < // реализация >public void sleep() < // реализация >> 

    14. Что такое default method в Interface?

    Теперь поговорим о дефолтных методах. Для чего, для кого? Эти методы добавили, чтобы все сделать «и вашим, и нашим». О чем это я? Да о том, что с одной стороны нужно было добавить новую функциональность: лямбды, Stream API, с другой стороны, нужно было оставить то, чем славится джава — обратную совместимость. Для этого нужно было ввести уже готовые решения в интерфейсы. Так к нам и пришли дефолтные методы. То есть, дефолтный метод — это реализованный метод в интерфейсе, у которого есть ключевое слово default . Например, всем известный метод stream() в интерфейсе Collection . Проверьте, этот интерфейс вовсе не так прост как кажется ;). Или также не менее известный метод forEach() из интерфейса Iterable . Его также не было до тех пор, пока не добавили дефолтные методы. Кстати, еще можно почитать на JavaRush об этом.

    15. А как тогда наследовать два одинаковых дефолтных метода?

    Исходя из предыдущего ответа на то, что такое дефолтный метод, можно задать другой вопрос. Если можно реализовать методы в интерфейсах, то теоретически можно реализовать два интерфейса с одинаковым методом, и как такое делать? Есть два разных интерфейса с одинаковым методом:

     interface A < default void foo() < System.out.println("Foo A"); >> interface B < default void foo() < System.out.println("Foo B"); >> 

    И есть класс, который реализует эти два интерфейса. Чтобы не было неопределенности и скомпилировался код, нам нужно переопределить метод foo() в классе C , причем можно просто вызвать в нем метод foo() любого из интерфейсов — A или B . Но только как выбрать специфический метод интерфейса А или В ? Для этого есть конструкция такого вида: A.super.foo() :

     public class C implements A, B < @Override public void foo() < A.super.foo(); >> 
     public class C implements A, B < @Override public void foo() < B.super.foo(); >> 

    Таким образом, метод foo() класса C будет использовать либо дефолтный метод foo() из интерфейса A , либо метод foo() из интерфейса B .

    16. Что такое абстрактные методы и классы?

    В джава есть зарезервированное слово abstract , которое используется для обозначения абстрактных классов и методов. Для начала — определения. Абстрактным методом называется метод, который создан без реализации с ключевым словом abstract в абстрактном классе. То есть, это метод как в интерфейсе, только с добавкой ключевого слова, например:

     public abstract void foo(); 

    Абстрактным классом называется класс, который имеет также abstract слово:

     public abstract class A
    • на его основе нельзя создать объект;
    • он может иметь абстрактные методы;
    • он может и не иметь абстрактные методы.

    17. Какая разница между String, String Builder и String Buffer?

    Значения String хранятся в пуле стрингов (constant string pool). Как только будет создана строка, она появится в этом пуле. И удалить ее будет нельзя. Например:

     String name = "book"; 

    Топ-50 Java Core вопросов и ответов на собеседовании. Часть 1 - 4

    . переменная будет ссылаться на стринг пул Constant string pool Если задать переменной name другое значение, получится следующее:

     name = "pen"; 

    Топ-50 Java Core вопросов и ответов на собеседовании. Часть 1 - 5

    Constant string pool Таким образом, эти два значения так и останутся там. String Buffer:

    • значения String хранятся в стеке(Stack). Если значение изменено, значит новое значение будет заменено на старое;
    • String Buffer синхронизирован, и поэтому он потокобезопасный;
    • из-за потокобезопасности скорость работы оставляет желать лучшего.

    Пример:

     StringBuffer name = "book"; 

    Топ-50 Java Core вопросов и ответов на собеседовании. Часть 1 - 6

    Как только значение name сменится, в стеке измениться значение: StringBuilder Точно такой же, как и StringBuffer , только он не потокобезопасный. Поэтому скорость его явно выше, чем в StringBuffer .

    18. Какая разница между абстрактным классом и интерфейсом?

    • абстрактные классы имеют дефолтный конструктор; он вызывается каждый раз, когда создается потомок этого абстрактного класса;
    • содержит как абстрактные методы, так и не абстрактные. По большому счету может и не содержать абстрактных методов, но все равно быть абстрактным классом;
    • класс, который наследуется от абстрактного, должен реализовать только абстрактные методы;
    • абстрактный класс может содержать Instance Variable(смотри вопрос №5).
    • не имеет никакого конструктора и не может быть инициализирован;
    • только абстрактные методы должны быть добавлены (не считая default methods);
    • классы, реализующие интерфейс, должны реализовать все методы (не считая default methods);
    • интерфейсы могут содержать только константы.

    19. Почему доступ по элементу в массиве происходит за O(1)?

    Это вопрос буквально с последнего собеседования. Как я узнал позже, это вопрос задается для того, чтобы увидеть, как человек мыслит. Ясно, что практического смысла в этих знаниях немного: хватает только лишь знания этого факта. Для начала нужно уточнить, что O(1) — это обозначение временной сложности алгоритма, когда операция проходит за константное время. То есть это обозначение самого быстрого выполнения. Чтобы ответить на этот вопрос, нужно понять, что мы знаем о массивах? Чтоб создать массив int , мы должны написать следующее:

     int[] intArray = new int[100]; 
    1. При создании массива известен его тип.Если известен тип, то понятно, какого размера будет каждая ячейка массива.
    2. Известно, какого размера будет массив.

    А как получается О(1) в доступе к объектам в ArrayList?

    Топ-50 Java Core вопросов и ответов на собеседовании. Часть 1 - 8

    Это вопрос сразу же идет за предыдущим. Ведь правда, когда мы работаем с массивом и там примитивы, то нам известно заранее, какой размер этого типа, при его создании. А что делать, если есть такая схема, как на картинке: и мы хотим создать коллекцию с элементами, у которых тип A, и добавить разные реализации — B, C, D:

     List list = new ArrayList(); list.add(new B()); list.add(new C()); list.add(new D()); list.add(new B()); 

    Как в этой ситуации понять, какой будет размер у каждой ячейки, ведь каждый объект будет разным и может иметь разные дополнительные поля (или быть полностью различными). Что делать? Здесь вопрос ставится так, чтобы запутать и сбить с толку. Мы же знаем, что на самом деле в коллекции хранятся не объекты, а лишь ссылки на эти объекты. А у всех ссылок размер один и тот же, и он известен. Поэтому здесь работает подсчет места так же, как и в предыдущем вопросе.

    21. Автоупаковка (autoboxing) и Автораспаковка (unboxing)

    Историческая справка: автоупаковка и автораспаковка — одно из главных нововведений JDK 5. Автоупаковка (autoboxing) — процесс автоматического преобразования из примитивного типа в соответствующий класс обертку. Автораспаковка (unboxing) — делает ровно обратное к автоупаковке — преобразует класс обертку в примитив. А вот если окажется значение обертки null , то при распаковке будет выброшено исключение NullPointerException .

    Соответствие примитив — обертка
    Примитив Класс обертка
    boolean Boolean
    int Integer
    byte Byte
    char Character
    float Float
    long Long
    short Short
    double Double
    Автоупаковка происходит:
    • когда присваивают примитиву ссылку на класс обертку: ДО Java 5:
     //ручная упаковка или как это было ДО Java 5. public void boxingBeforeJava5() < Boolean booleanBox = new Boolean(true); Integer intBox = new Integer(3); // и так далее к другим типам >после Java 5: //автоматическая упаковка или как это стало в Java 5. public void boxingJava5() < Boolean booleanBox = true; Integer intBox = 3; // и так далее к другим типам >
     public void exampleOfAutoboxing() < long age = 3; setAge(age); >public void setAge(Long age)
    Автораспаковка происходит:
    • когда присваиваем классу обертке примитивную переменную:
     //до Java 5: int intValue = new Integer(4).intValue(); double doubleValue = new Double(2.3).doubleValue(); char c = new Character((char) 3).charValue(); boolean b = Boolean.TRUE.booleanValue(); //и после JDK 5: int intValue = new Integer(4); double doubleValue = new Double(2.3); char c = new Character((char) 3); boolean b = Boolean.TRUE; 
     // До Java 5 Integer integerBox1 = new Integer(1); Integer integerBox2 = new Integer(2); // для сравнения нужно было делать так: integerBox1.intValue() > integerBox2.intValue() //в Java 5 integerBox1 > integerBox2 
     public void exampleOfAutoboxing() < Long age = new Long(3); setAge(age); >public void setAge(long age)

    22. Что такое ключевое слово final и где его использовать?

    1. final переменную нельзя переназначить на другой объект.
    2. final класс бесплоден)) у него не может быть наследников.
    3. final метод не может быть переопределен у предка.
    final переменные
    1. Можно объявить переменную и инициализировать ее позже.
    2. Можно объявить переменную и сразу же назначить ее.
     public class FinalExample < //статическая переменная final, которая сразу же инициализируется: final static String FINAL_EXAMPLE_NAME = "I'm likely final one"; //final переменная, которая не инициализирована, но работать будет только если //инициализировать это в конструкторе: final long creationTime; public FinalExample() < this.creationTime = System.currentTimeMillis(); >public static void main(String[] args) < FinalExample finalExample = new FinalExample(); System.out.println(finalExample.creationTime); // final поле FinalExample.FINAL_EXAMPLE_NAME не может быть заасайнено // FinalExample.FINAL_EXAMPLE_NAME = "Not you're not!"; // final поле Config.creationTime не может быть заасайнено // finalExample.creationTime = 1L; >> 
    Можно ли считать Final переменную константой?

    Поскольку у нас не получится присвоить новое значение для final переменной, кажется, что это переменные константы. Но это только на первый взгляд. Если тип данных, на который ссылается переменная — immutable , то да, это константа. А если тип данных mutable , то есть изменяемый, при помощи методов и переменных можно будет изменить значение объекта, на который ссылается final переменная, и в таком случае назвать ее константой нельзя. Так вот, на примере видно, что часть финальных переменных действительно константы, а часть — нет, и их можно изменить.

     public class FinalExample < //неизменяемые финальные переменные: final static String FINAL_EXAMPLE_NAME = "I'm likely final one"; final static Integer FINAL_EXAMPLE_COUNT = 10; //изменяемые фильнаные переменные final Listaddresses = new ArrayList(); final StringBuilder finalStringBuilder = new StringBuilder("constant?"); > 
    Local final переменные

    Когда final переменная создается внутри метода, ее называют local final переменная:

     public class FinalExample < public static void main(String[] args) < // Вот так можно final int minAgeForDriveCar = 18; // а можно и так, в цикле foreach: for (final String arg : args) < System.out.println(arg); >> > 

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

     // final local переиенная j не может быть назначена for (final int i = 0; i
    Final класс

    Нельзя расширять класс, объявленный как final . Проще говоря, никакой класс не может наследоваться от данного. Прекрасным примером final класса в JDK является String . Первый шаг к созданию неизменяемого класса — пометить его как final , и тогда нельзя будет его расширить:

     public final class FinalExample < >// Здесь будет ошибка компиляции class WantsToInheritFinalClass extends FinalExample
    Final методы

    Когда метод маркирован как final, его называют final метод (логично, правда?). Final метод нельзя переопределять у класса наследника. К слову, методы в классе Object — wait() и notify() — это final, поэтому у нас нет возможность их переопределять.

     public class FinalExample < public final String generateAddress() < return "Some address"; >> class ChildOfFinalExample extends FinalExample < // здесь будет ошибка компиляции @Override public String generateAddress() < return "My OWN Address"; >> 
    Как и где использовать final в Java
    • использовать ключевое слово final, чтобы определить некоторые константы уровня класса;
    • создавать final переменные для объектов, когда вы не хотите, чтобы они были изменены. Например, специфичные для объекта свойства, которые мы можем использовать для целей логирования;
    • если не нужно, чтобы класс был расширен, отметить его как окончательный;
    • если нужно создать immutable < класс, нужно сделать его финальным;
    • если нужно, чтоб реализация метода не менялась в наследниках, обозначить метод как final . Это очень важно, чтобы быть уверенным, что реализация не изменится.

    23. Что такое mutable immutable?

    Mutable

    Mutable называются объекты, чьи состояния и переменные можно изменить после создания. Например такие классы, как StringBuilder, StringBuffer. Пример:

     public class MutableExample < private String address; public MutableExample(String address) < this.address = address; >public String getAddress() < return address; >// этот сеттер может изменить поле name public void setAddress(String address) < this.address = address; >public static void main(String[] args) < MutableExample obj = new MutableExample("first address"); System.out.println(obj.getAddress()); // обновляем поле name, значит это mutable объект obj.setAddress("Updated address"); System.out.println(obj.getAddress()); >> 
    Immutable

    Immutable называются объекты, состояния и переменные которых нельзя изменить после создания объекта. Чем не отличный ключ для HashMap, да?) Например, String, Integer, Double и так далее. Пример:

     // сделаем этот класс финальным, чтобы никто не мог его изменить public final class ImmutableExample < private String address; ImmutableExample (String address) < this.address = address; >public String getAddress() < return address; >//удаляем сеттер public static void main(String[] args) < ImmutableExample obj = new ImmutableExample("old address"); System.out.println(obj.getAddress()); // Поэтому никак не изменить это поле, значит это immutable объект // obj.setName("new address"); // System.out.println(obj.getName()); >> 

    24. Как написать immutable класс?

    • сделать класс финальным.
    • сделать все поля приватными и создать только геттеры к ним. Сеттеры, разумеется, не нужно.
    • Сделать все mutable поля final, чтобы установить значение можно было только один раз.
    • инициализировать все поля через конструктор, выполняя глубокое копирование (то есть, копируя и сам объект, и его переменные, и переменные переменных, и так далее)
    • клонировать объекты mutable переменных в геттерах, чтобы возвращать только копии значений, а не ссылки на актуальные объекты.
     /** * Пример по созданию immutable объекта. */ public final class FinalClassExample < private final int age; private final String name; private final HashMapaddresses; public int getAge() < return age; >public String getName() < return name; >/** * Клонируем объект перед тем, как вернуть его. */ public HashMap getAddresses() < return (HashMap) addresses.clone(); > /** * В конструкторе выполняем глубокое копирование для mutable объектов. */ public FinalClassExample(int age, String name, HashMap addresses) < System.out.println("Выполняем глубокое копирование в конструкторе"); this.age = age; this.name = name; HashMaptemporaryMap = new HashMap<>(); String key; Iterator iterator = addresses.keySet().iterator(); while (iterator.hasNext()) < key = iterator.next(); temporaryMap.put(key, addresses.get(key)); >this.addresses = temporaryMap; > >
    • Мой профиль на GitHub
    • Топ-50 Java Core вопросов и ответов на собеседовании. Часть 2

    Что спрашивают на собеседовании java

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

    Оцените по десятибалльной шкале — насколько вы хороши в Java?

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

    Объясните отличия между Java 7 и 8 ?

    На самом деле отличий очень много. Достаточно перечислить наиболее значимые. Вы должны объяснить новые функции Java 8. Полный список можно посмотреть тут Java 8 JDK.

    Минимум который вы должны знать:

    • Лямбда-выражения — это анонимные методы, который позволяют использовать код, как данные и передавать его в качестве аргумента в методы.
    • Ссылки на методы сокращают написание лямбда-выражений.
    • Методы по умолчанию позволяют добавлять реализации методов в интерфейсы. Это облегчает работу разработчиков библиотек, обеспечивая возможность добавления новых методов в интерфейсы не нарушаю работу их старых версий.
    • Повторяемые аннотации позволяют использовать множество аннотаций одного типа в одном и том же элементе.

    Какие типы коллекций вы знаете?
    Вы должны знать о наиболее важных:

    • ArrayList
    • LinkedList
    • HashMap
    • HashSet

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

    Какие методы имеет класс Object?

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

    Класс Object, из пакета java. lang, находится на вершине иерархии классов. Каждый класс является прямым или косвенным потомком класса Object. Любой класс, который вы используете или пишете, наследует методы Object:

    • protected Object clone() throws CloneNotSupportedException
      создает и возвращает копию данного объекта
    • public boolean equals(Object obj) используется для сравнения объектов
      Реализация по умолчанию сравнивает ссылки на объекты
    • protected void finalize() throws Throwable
      вызывается сборщиком мусора, когда он определяет, что на объект больше не существует ни одной ссылки
    • public final Class getClass()
      возвращает объект типа Class для данного объекта
    • public int hashCode()
      возвращает значение хеш-кода объекта
    • public String toString()
      возвращает строковое представление объекта

    Метода notify, notifyAll и wait класса Object необходимы для синхронизации работы потоков. Вот все эти методы:

    • public final void notify()
    • public final void notifyAll()
    • public final void wait()
    • public final void wait(long timeout)
    • public final void wait(long timeout, int nanos)

    Почему объект String в Java является неизменяемым?

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

    Какая разница между final, finally и finalize()?

    • final — ключевое слово, используемое в различных обстоятельствах, для обозначение сущности (объекта, метода, класса) которая может быть определена единожды.

    Что такое проблема ромба?

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

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

    Как вы можете сделать класс неизменяемым?
    Чтобы достичь неизменяемости класса необходимо сделать несколько модификаций вашего класса:

    1. Объявите класс как final, чтобы от него нельзя было наследоваться;
    2. Сделайте все поля приватными чтобы запретить прямой доступ;
    3. Не создавайте сеттеры для полей;
    4. Сделайте все поля класса финальными, чтобы их можно было инициализировать только один раз;
    5. Инициализируйте все поля через конструктор, делающий глубокую копию;
    6. Реализуйте клонирование объектов в getter методах так, чтобы они возвращали копии объектов, а не ссылки на них.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *