15 питань щодо Core Java для програмістів з 5-6 досвідом розробки
Всі питання були отримані від працюючих старших розробників, які мають більш ніж 5-річний досвід роботи. Розробники зустрічалися з цими питаннями на різних етапах працевлаштування, включаючи телефонні інтерв'ю та співбесіди віч-на-віч.-
Як працює метод
get
класуHashMap
Java?Так, це, як і раніше, одне з найпопулярніших питань для старшого розробника, ви повинні чекати його на телефонному інтерв'ю, після нього можливо буде багато суміжних питань, подивіться відповіді на них тут .
-
Які 2 методи має реалізувати об'єкт ключа
HashMap
?equals
іhashcode
-
Чому об'єкти, що використовуються як ключ, повинні бути іммутабельними (незмінними)?
Щоб хеш-код завжди повертав одне й те саме значення.
-
Завдяки чому
ConcurrentHashMap
досягається масштабованість?Іноді це питання звучить на інтерв'ю як: різниця між
ConcurrentHashMap
іHashtable
Java, пошукайте відповіді тут . -
Як зробити об'єкт спільним для різних потоків? Або як передати об'єкт від одного потоку до іншого?
Є багато шляхів реалізації цього, такі як черги, обмінники, але блоковані черги з шаблоном проектування Producer/Consumer це найпростіший спосіб передати об'єкт з одного потоку в інший.
-
Як дізнатися, що у вашій програмі є взаємне блокування?
(Отримавши дамп потоку, використовуючи kill -3, застосовуючи JConsole чи VisualVM). Я пропоную підготуватися до цього питання на інтерв'ю дуже ретельно, оскільки інтерв'юери люблять деталі, вони запитують, чи були у вашому проекті подібні проблеми і як вам вдалося їх вирішити.
-
Як уникнути взаємних блокувань під час кодування?
Щоб розібратися з блокуваннями і отримати повну інформацію про тему, прочитайте це .
-
Що таке очікування зайнятості ("Busy spinning")? Чому ви маєте використовувати його?
Одне з найцікавіших питань багатопоточності для старшого розробника Java, Busy spinning – це стратегія очікування, коли потік виконує очікування в циклі, при цьому не використовуючи ресурси процесора і як би засинаючи . Цю стратегію використовують, коли час очікування дуже мало, при цьому не навантажується процесор і не зупиняється потік, зберігаються всі дані, які можуть бути втрачені при запуску потоку на іншому ядрі процесора. Це питання популярне у програмістів, які створюють високо навантажені проекти, де програмісти домагаються надзвичайно низьких затримок у роботі, в діапазоні мікро- і мілі-секунд.
-
Що таке блокування Читання та Записи (
ReadWriteLock
)? Чи використовуєConcurrentHashMap ReadWrite
блокування?Блокування Читання та Записи це така реалізація блокування, коли кілька різних потоків намагаються зробити операцію читання та запису з одним об'єктом. сама собою операція читання не змінює об'єкт, що допускає багатопотокові операції читання без блокувань. Java надає реалізацію
ReadWriteLock
з якою варто ознайомитись. Наприклад ,ConcurrentHashMap
не застосовуєReadWriteLock
, замість цього він ділитьHash
на окремі частини і блокує їх окремо, таким чином у будь-який момент часу заблокована тільки частина хеша, а не він весь. Це питання популярне у досвідчених розробників, які зазвичай просять відповісти докладніше, запитують різні реалізації ReadWriteLock для різних випадків. -
Як зробити об'єкт іммутабельним (не змінним) Java? Навіщо робити об'єкт іммутабельним?
Імутабельність передбачає кілька переваг, включаючи потокобезпеку, можливість кешування, а так само робить багатопоточний код більш читаним.
Подивіться це та навчитеся робити об'єкти іммутабельними. На співбесіді з цього питання можливі додаткові уточнення залежно від повноти вашої відповіді. Наприклад коли ви кажете, що Spring іммутабельний, будьте готові відповісти чому рядки так само іммутабельні Java.
-
Які шаблони проектування використовуєте?
Завжди чекайте на питання про шаблони проектування на співбесіді до вакансії старшого розробника. Краще відзначити будь-який GOF шаблон, а не Singleton або MVC, який використовує кожен другий Java програміст. Найкращою відповіддю може бути шаблон Декоратор або шаблон Впровадження залежності , які досить популярні в Spring Framework. Так само добре, якщо звані вами шаблони проектування ви дійсно використовували і знаєте, до якого компромісу веде їх застосування. Як тільки ви скажете назву шаблону проектування, наприклад: "Фабрика", інтерв'юер відразу запитає: "Ви використовували це у своїх проектах?" Тому будьте готові навести приклади та розповісти чому ви вибрали у своєму проекті саме цей шаблон.
-
Чи знаєте ви про принцип Відкритості/Закритості чи Принцип підстановки Барбари Лисків ?
Шаблони проектування ґрунтуються на принципах об'єктно-орієнтованого проектування.
Настійно рекомендую подивитися мою статтю 10 принципів об'єктно орієнтованого дизайну , які повинен знати програміст Java, принаймні мати уявлення про те, як ці принципи допоможуть вам писати об'єктно орієнтований код. Якщо у вас немає відповіді на це питання, ви можете ввічливо відповісти "ні", ніхто не очікує від вас знання відповіді на всі запитання. Однак, знаючи відповідь на питання, яке викликає труднощі у більшості розробників, ви робите свою кандидатуру на співбесіді дуже сильною.
- Який шаблон проектування використовуватимете, щоб захистити ваш код від сторонньої бібліотеки, яка буде замінена через кілька років?
Це лише один з можливих варіацій питання про шаблони проектування, які можуть бути задані вам залежно від того, про що ви говорите зараз на співбесіді. Один із способів як захистити свій код від сторонньої бібліотеки, це залежність від інтерфейсу, а не від реалізації та використання залежностей, щоб забезпечити конкретну реалізацію. Подібні питання часто ставлять старшим розробникам із 5-7 роками досвіду роботи.
-
Як запобігти SQL ін'єкції в коді Java?
Це питання частіше ставлять Java EE розробникам, ніж звичайним Java програмістам, проте це чудова нагода дізнатися про PreparedStatement. PreparedStatement - це об'єкт, який представляє попередньо скомпільований SQL-оператор. Підпорядкованедержавність не тільки забезпечує більш високу продуктивність, але й захищає від SQL ін'єкцій. Якщо ви працюєте здебільшого з Java EE або J2EE, ви повинні бути знайомі з деякими питаннями безпеки, у тому числі "атака Фіксації Сесії" або "міжсайтовий скриптинг", так само вам потрібно вміти уникати цих атак.
-
Розкажіть про відмінності типів посилань у Java, таких як WeakReference, SoftReference та PhantomReference? І чому ви маєте їх використовувати?
По суті, різницю між усіма типами посилань лише одне — поведінка Java Garbage Collector з об'єктами, куди вони посилаються. У Java об'єкти, створювані через оператор new створюються за сильним посиланням. Складальник сміття (garbage collector) знищує такі об'єкти тільки тоді, коли на них більше не залишається сильних посилань. У пакеті java.lang.ref є 3 класи, які описують 3 типи посилань, відповідно SoftReference, WeakReference, PhantomReference. Об'єкти, створені через SoftReference, будуть зібрані, якщо JVM вимагає пам'ять. Тобто є гарантія, що всі SoftReference об'єкти будуть зібрані, перш ніж JVM викине виняток OutOfMemoryError. SoftReference часто використовується для кешів, які споживають велику кількість пам'яті. WeakReference не рятує об'єкт від фіналізації, навіть якщо є достатньо вільної пам'яті. Як тільки на об'єкт не залишиться strong та soft посилань, він може бути фіналізований. Використовується для кешів і створення ланцюгів пов'язаних між собою об'єктів. Об'єкти, створені через PhantomReference, знищуються тоді, коли GC визначають, що об'єкти, що посилаються, можуть бути звільнені. Цей тип посилань використовується як альтернатива фіналізації (для більш гнучкого звільнення ресурсів).
Це весь перелік питань для інтерв'ю старшого Java розробника. Я не включив у нього багато важливих питань щодо обробки винятків, збирача сміття, налаштування JVM, які дуже популярні у старших розробників, можливо я включу їх у наступній частині. Але якщо ви не знаходите відповіді на якесь питання, дайте мені знати і я оновлю цей пост для моїх постійних читачів.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ