Библиотека собеса по Java | вопросы с собеседований
Kanalga Telegram’da o‘tish
Вопросы с собеседований по Java и ответы на них. По рекламе: @proglib_adv Учиться у нас: clc.to/3wECtA Для обратной связи: @proglibrary_feeedback_bot
Ko'proq ko'rsatish6 463
Obunachilar
Ma'lumot yo'q24 soatlar
-37 kunlar
-1430 kunlar
Postlar arxiv
⚡️Самые полезные каналы по Java в одной папке
В ней:
➖канал для подготовки к собеседованиям
➖интересные задачи
➖основной канал
➖книги по Java
➖лучшие вакансии из сферы
➖и наш чат, в котором можно общаться и задавать вопросы
Добавляйте 👉 тык сюда
ℹ️ Какие виды тестирования существуют?
🧪 Unit-тесты: Проверяют работу отдельных, минимальных единиц кода, например, методов или классов, в изоляции. Основная цель — убедиться, что каждый отдельный модуль работает корректно.
🔗 Integration-тесты: Проверяют, как разные модули приложения взаимодействуют между собой. Часто требуют настройки окружения, например, базы данных или API, и помогают выявить ошибки на уровне интеграции.
🎭 End-to-End (E2E) тесты: Проверяют полную цепочку действий в приложении, начиная от пользовательского интерфейса и заканчивая бекендом и базой данных. Цель — убедиться, что вся система работает корректно от начала до конца.
🔄 Regression-тесты: Направлены на проверку, что новые изменения в коде не сломали существующую функциональность. Обычно включают в себя повторение уже существующих тестов.
🛠 Acceptance-тесты: Проверяют, соответствует ли функциональность приложения требованиям заказчика или конечного пользователя. Обычно проводятся на последнем этапе, перед выпуском продукта в продакшн.
💡 Performance-тесты: Оценивают производительность системы — время отклика, пропускную способность и поведение под нагрузкой. Помогают убедиться, что приложение остаётся стабильным при большом количестве запросов.
❓ Что такое IoC?
IoC (Inversion of Control) — это принцип проектирования, при котором объекты не создают свои зависимости самостоятельно, а получают их извне, обычно через контейнер управления зависимостями. В Java одной из популярных реализаций этого принципа является Spring Framework, который использует IoC-контейнер для создания, связывания и управления жизненным циклом объектов приложения.
Основная идея IoC заключается в том, что контейнер берет на себя ответственность за инициализацию и конфигурацию объектов, позволяя разработчику сфокусироваться на логике приложения, а не на управлении зависимостями. Это достигается через Dependency Injection (DI) — механизм, при котором зависимости передаются объекту в момент его создания.
❓ Что такое Integration Tests?
Интеграционные тесты — это тесты, которые проверяют совместную работу нескольких компонентов приложения, чтобы убедиться, что они корректно взаимодействуют друг с другом. В отличие от unit-тестов, они проверяют, как модули функционируют в связке, а не изолированно.
Ключевые особенности:
🧩 Взаимодействие компонентов: Integration-тесты помогают выявить проблемы в интеграции разных модулей, таких как базы данных, внешние API и другие системные компоненты.
🌐 Зависимость от окружения: Часто требуют доступ к реальной или тестовой среде, например, к базе данных или к другим внешним ресурсам. Для изоляции и имитации окружения могут использоваться инструменты вроде Testcontainers и WireMock.
⏱️ Медленное выполнение: Интеграционные тесты занимают больше времени, чем unit-тесты, из-за необходимости взаимодействия с внешними системами. Поэтому их обычно выполняют реже — например, перед релизом или при существенных изменениях в коде.
👀 Задачи с собеседований: Поиск первого уникального символа в строке (jun+)
— Как найти первый уникальный символ в строке?
💡 Ключевые моменты:
- Используйте доп. структуру данных для хранения количества вхождений каждого символа
- Предложите в комментарии другие варианты решения.
Реализация через Map на картинке 👆🏻
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
❓ Что такое сериализация?
Сериализация — это процесс преобразования объекта в поток байтов для сохранения его состояния или передачи по сети. Этот процесс позволяет сохранять данные объекта и его связи с другими объектами, так что их можно восстановить (десериализовать) позже. Сериализация поддерживает версионность с помощью serialVersionUID, что помогает проверять совместимость классов при изменениях.
❓ Что такое Garbage Collector?
Garbage Collector (GC) — это компонент JVM, который управляет памятью приложения. Он освобождает память, удаляя объекты, которые больше не используются, и к которым нет активных ссылок. Благодаря GC можно не заботиться о ручном освобождении памяти, как в некоторых других языках, что упрощает разработку и снижает риск утечек памяти.
❓ Разница между итераторами fail-fast и fail-safe?
🔹 Fail-fast итераторы обнаруживают изменения в коллекции во время итерации (например, добавление или удаление элементов) и немедленно выбрасывают ConcurrentModificationException. Эти итераторы работают напрямую с исходной коллекцией и обеспечивают высокую производительность, но не защищены от одновременных модификаций. Примеры коллекций, поддерживающих fail-fast итераторы, — ArrayList, HashSet, HashMap.
🔹 Fail-safe итераторы, в свою очередь, создают копию коллекции для итерации, что позволяет обходить коллекцию, даже если в нее вносятся изменения во время обхода. Они защищены от ConcurrentModificationException, но требуют больше памяти и процессорных ресурсов. Примеры коллекций, поддерживающих fail-safe итераторы, — CopyOnWriteArrayList и ConcurrentHashMap.
ℹ️ Как устроен под капотом HashMap?
HashMap — это коллекция, обеспечивающая хранение пар "ключ-значение" и быструю работу с элементами за амортизированное O(1) время для операций вставки и поиска.
🔹 Структура HashMap
В основе HashMap лежит массив, где каждый элемент представляет собой "корзину" (bucket), и эти корзины хранят связные списки или сбалансированные деревья. Как работает эта структура:
▪️ Ключи: Ключ должен быть иммутабельным, а также допускается null в качестве ключа.
▪️ Хэширование: Для вычисления индекса бакета HashMap находит хэш для ключа. Далее используется операция побитового И (&) хэш-функции и n-1, где n - текущий размер массива бакетов (index = (n - 1) & hash).
▪️ Коллизии и цепочки: Если несколько ключей попадают в одну корзину (коллизия), HashMap использует связные списки для хранения этих значений. Когда длина связного списка превышает 8 элементов, HashMap автоматически преобразует его в красно-черное дерево для повышения эффективности поиска и вставки, обеспечивая O(log n) сложность для операций в таких корзинах.
🔹 Производительность
▪️ Добавление: За амортизированное O(1) время. При добавлении ключа HashMap сначала вычисляет хэш, а затем индекс корзины, где будет храниться элемент. Если корзина пуста, добавляется новый элемент. Если элемент с таким ключом уже есть, он заменяется.
▪️ Удаление: В зависимости от структуры корзины, время удаления элемента составляет O(1) для небольших корзин или O(log n) для корзин, содержащих красно-черное дерево.
▪️ Поиск: За амортизированное O(1) время при низком уровне коллизий. Однако в случае высоких коллизий и преобразования корзины в дерево сложность поиска возрастает до O(log n).
🔹 Использование памяти
Каждый элемент HashMap хранит не только ключ и значение, но также ссылки на следующий элемент в связном списке (или ссылки в дереве, если оно используется). Для эффективной работы HashMap настраивается порог "коэффициента загрузки" (load factor), после которого размер массива увеличивается вдвое, чтобы сократить количество коллизий.
🔹 Преимущества и недостатки
▪️ Преимущества:
- Доступ к элементам за амортизированное O(1).
- Возможность использования как связных списков, так и красно-черных деревьев позволяет HashMap эффективно справляться с коллизиями.
▪️ Недостатки:
- HashMap не гарантирует порядок элементов, в отличие от, например, TreeMap.
- Ссылки на элементы создают определенные накладные расходы, а при увеличении массива корзин в процессе реасширения требуются дополнительные ресурсы.
❓ Что такое ClassLoader?
ClassLoader — это компонент JVM, который отвечает за загрузку классов в память во время выполнения. В отличие от многих языков, Java не загружает все классы сразу. Вместо этого, каждый класс загружается только тогда, когда он необходим, что позволяет экономить ресурсы и управлять зависимостями более гибко.
🔍 Основные типы ClassLoader:
Bootstrap ClassLoader — загружает основные библиотеки Java из JDK (например, java.lang.*, java.util.*).
Extension ClassLoader — загружает расширения или библиотеки, находящиеся в папке ext внутри JDK.
Application (System) ClassLoader — загружает классы, определенные в CLASSPATH приложения.
Каждый ClassLoader сначала пытается передать задачу загрузки родительскому класслоадеру, обеспечивая таким образом иерархическую структуру загрузки. Также позволяет запускать разные версии библиотек одновременно, предотвращая конфликты классов.
❓ Что такое прокси-объект и для чего он используется?
Прокси-объект — это объект-заместитель, который выступает посредником между клиентом и реальным объектом, контролируя доступ к этому объекту. Он реализует тот же интерфейс, что и сам объект, и может добавлять дополнительную логику, не изменяя поведение основного объекта.
- В Spring прокси-объекты часто создаются для применения аспектов (AOP), таких как логирование, транзакции или безопасность.
- В Hibernate прокси-объекты широко применяются для реализации ленивой загрузки.
❓ В чём разница между throw и throws?
- throws: указывается в сигнатуре метода, чтобы сообщить, какие исключения метод может выбросить. Например, если метод может генерировать FileNotFoundException, это указывается так:
public void readFile() throws FileNotFoundException { ... }
Здесь throws не выбрасывает исключение, а только предупреждает, что оно может возникнуть.
- throw: используется непосредственно в теле метода, чтобы выбросить конкретное исключение. Пример:
if (file == null) {
throw new FileNotFoundException("Файл не найден");
}
Здесь throw запускает исключение, когда возникает определённое условие.❓ В чем основные различия между checked и unchecked исключениями?
Проверяемые исключения (Checked Exceptions) требуют обработки во время компиляции. Это исключения, которые происходят из класса Exception, но не являются подклассами RuntimeException. Нужно либо обрабатывать такие исключения с помощью try-catch, либо объявлять их в сигнатуре метода с ключевым словом throws. Их цель — предупредить ошибки, которые могут быть предсказаны, но неизбежны, например, проблемы с доступом к файлам.
Непроверяемые исключения (Unchecked Exceptions) включают в себя RuntimeException и его подклассы, такие как NullPointerException, IndexOutOfBoundsException и IllegalArgumentException. Эти исключения происходят во время выполнения и сигнализируют о логических ошибках в коде, которые обычно можно избежать, если правильно построить логику программы. Обработка таких исключений — выбор разработчика, поскольку они не проверяются компилятором и, как правило, возникают из-за ошибок программиста, которые не связаны с внешними условиями.
❓ Чем отличается процесс от потока?
Процесс — это отдельная программа, выполняющаяся в своей выделенной области памяти. У каждого процесса есть собственное адресное пространство, и он изолирован от других процессов. Взаимодействие между процессами требует механизмов межпроцессного взаимодействия (IPC), таких как сокеты, каналы или общая память. Это делает процессы более независимыми, но обмен данными между ними — более сложным и ресурсозатратным.
Поток (или "нить") — это "легковесная" единица выполнения, которая работает в рамках одного процесса и использует общую память этого процесса. В Java потоки одного процесса могут совместно использовать объекты и переменные, что значительно упрощает взаимодействие между ними по сравнению с процессами. Однако такая общая память влечет за собой риски, такие как состояния гонок и необходимость синхронизации, чтобы избежать конфликтов при одновременном доступе к ресурсам.
🤔 Нужна ли математика на собеседованиях?
🗓 Сегодня в 20:00 встречаемся в прямом эфире, чтобы обсудим роль математики на собеседовании, а также поделимся инсайдами как успешно пройти техническое собеседование! https://proglib.io/w/47174041
🌟 Спикер: Станислав Петров – Senior Data Scientist.
😮 На вебинаре вы узнаете:
😱 Ошибаться — не страшно. Как ошибки и неудачные проекты могут стать ценным опытом. Почему «проекты в стол» способствуют профессиональному росту. И как преодолеть путь от junior до senior.
🙌🏻 Собеседования: можно ли к ним не готовиться?! Поделимся эффективными стратегиями подготовки и расскажем, на что работодатели обращают внимание в первую очередь.
✍️ Разберем реальные тестовые задачи, которые дают на собеседованиях на позицию Data Scientist.
🎁 Бонус: расскажем как проводить эффективное тестирование в маркетинге и их масштабируемость.
🎯 Почему важно посетить вебинар?
• Понимание математических концепций и их применение помогает успешно проходить собеседования и решать реальные задачи.
• Расширьте свой профессиональный кругозор и подготовьтесь к новым карьерным вызовам.
👉 Присоединяйтесь к нам и узнайте, как математика может помочь в вашей карьере https://proglib.io/w/47174041
❓ Что означает буква "O" в SOLID?
"O" — это Open/Closed Principle (Принцип открытости/закрытости). Классы должны быть открыты для расширения, но закрыты для модификации. Это означает, что поведение класса можно изменять через наследование или реализацию интерфейсов, не изменяя его исходный код.
🧑💻 Пример:
Вместо изменения существующего класса для добавления новой функциональности, мы можем создать новый класс, который расширит существующий, сохраняя оригинальный код неизменным.
🧪 Чем заменить Postman: 5 отличных инструментов для разработки API
Postman долгое время был основным инструментом для разработки и тестирования API, но сейчас для большинства разработчиков его ограничения стали перевешивать преимущества. Рассмотрим альтернативные инструменты, которые могут предложить больше возможностей, чем Postman — даже в бесплатной версии.
👉Читаем здесь
ℹ️ Как устроен под капотом TreeMap?
TreeMap — это реализация интерфейса Map в Java, которая сохраняет элементы в отсортированном порядке. В отличие от HashMap и LinkedHashMap, которые не гарантируют порядок, TreeMap организует элементы по естественному порядку или с помощью заданного Comparator. Это достигается с помощью красно-чёрного дерева, структуры данных, поддерживающей отсортированный порядок с высокой эффективностью.
🔹 Структура TreeMap
TreeMap основан на красно-чёрном дереве, что позволяет выполнять операции вставки, удаления и поиска за логарифмическое время:
▪️ Каждая запись (node) в TreeMap содержит ссылки на левый и правый дочерние узлы, а также на родительский узел. Красно-чёрное дерево поддерживает сбалансированность, что минимизирует высоту дерева.
▪️ Каждый узел имеет атрибут «цвет» — красный или чёрный, что позволяет TreeMap быстро балансировать дерево при добавлении или удалении элементов.
🔹 Производительность
▪️ Вставка: Добавление новых элементов выполняется за O(log n), так как операция требует соблюдения порядка и может потребовать перестройки дерева для поддержания баланса.
▪️ Удаление: Удаление элементов также выполняется за O(log n), с обязательной корректировкой баланса дерева.
▪️ Поиск: Поиск элементов по ключу также занимает O(log n), благодаря сбалансированному дереву.
🔹 Использование памяти
Каждый узел в TreeMap содержит ссылки на дочерние узлы и родительский узел, а также информацию о цвете. Из-за этого TreeMap требует больше памяти, чем обычный HashMap, но сохраняет отсортированный порядок ключей.
🔹 Преимущества и недостатки
▪️ Преимущества:
- Поддержание отсортированного порядка: TreeMap гарантирует, что элементы будут отсортированы по возрастанию (или согласно Comparator), что полезно для приложений, где важен порядок ключей.
- Быстрая навигация: TreeMap поддерживает методы для нахождения минимальных и максимальных элементов, а также диапазонные операции, такие как subMap, headMap и tailMap.
- Балансировка: Красно-чёрное дерево автоматически балансируется, что обеспечивает высокую производительность на больших наборах данных.
▪️ Недостатки:
- Более высокие временные затраты на вставку и удаление: В отличие от HashMap и LinkedHashMap, TreeMap требует логарифмическое время на операции из-за необходимости поддержания баланса.
- Более высокое потребление памяти: Дополнительные ссылки и атрибуты для балансировки увеличивают использование памяти по сравнению с HashMap.
- Не поддерживает null ключи: В TreeMap нельзя использовать null в качестве ключа, что ограничивает его использование в некоторых сценариях.
Repost from Библиотека ИИ для айтишников
⚡️Разыгрываем флагманский смартфон
«Библиотека программиста» разыгрывает один из трех смартфонов на выбор:
🔹Samsung Galaxy S24 Ultra на 1 ТБ
🔹Xiaomi 14 Ultra на 512 ГБ
🔹iPhone 16 Pro Max на 512 ГБ
🔥 А еще 99 участников розыгрыша получат скидку 50% на наш курс Базовые модели ML и приложения!
Промокод будет действителен до 20 ноября.
Условия просты:
→ подписаться на Библиотека нейротекста
→ подписаться на Библиотека нейрозвука
→ подписаться на Библиотека нейрокартинок
→ нажать на кнопку «Участвовать» под этим постом
Итоги появятся 30 октября в 20:00 по московскому времени в нашем канале Библиотека программиста. Затем мы свяжемся с победителем, который сам выберет смартфон. Тем, кто получит промокод, мы вышлем его в течение недели после окончания розыгрыша.
⚠️ Убедитесь, что вам можно написать в личные сообщения или следите за результатами — если мы не сможем с вами связаться, то не сможем и отправить приз. Доставить мы можем только в города России и Беларуси.
