uz
Feedback
Библиотека собеса по Java | вопросы с собеседований

Библиотека собеса по Java | вопросы с собеседований

Kanalga Telegram’da o‘tish

Вопросы с собеседований по Java и ответы на них. По рекламе: @proglib_adv Учиться у нас: clc.to/3wECtA Для обратной связи: @proglibrary_feeedback_bot

Ko'proq ko'rsatish
6 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+) — Как найти первый уникальный символ в строке? �
👀 Задачи с собеседований: Поиск первого уникального символа в строке (jun+) — Как найти первый уникальный символ в строке? 💡 Ключевые моменты: - Используйте доп. структуру данных для хранения количества вхождений каждого символа - Предложите в комментарии другие варианты решения. Реализация через Map на картинке 👆🏻

🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи Напоминаем, что у нас есть бесплатный курс для всех, кто хо
🧑‍💻 Статьи для 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 встречаемся в прямом эфире, чтобы обсудим роль математики на соб
🤔 Нужна ли математика на собеседованиях? 🗓 Сегодня в 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 долгое время был основным инструментом для разраб
🧪 Чем заменить 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 в качестве ключа, что ограничивает его использование в некоторых сценариях.

⚡️Разыгрываем флагманский смартфон «Библиотека программиста» разыгрывает один из трех смартфонов на выбор: 🔹Samsung Galaxy S
⚡️Разыгрываем флагманский смартфон «Библиотека программиста» разыгрывает один из трех смартфонов на выбор: 🔹Samsung Galaxy S24 Ultra на 1 ТБ 🔹Xiaomi 14 Ultra на 512 ГБ 🔹iPhone 16 Pro Max на 512 ГБ 🔥 А еще 99 участников розыгрыша получат скидку 50% на наш курс Базовые модели ML и приложения! Промокод будет действителен до 20 ноября. Условия просты: → подписаться на Библиотека нейротекста → подписаться на Библиотека нейрозвука → подписаться на Библиотека нейрокартинок → нажать на кнопку «Участвовать» под этим постом Итоги появятся 30 октября в 20:00 по московскому времени в нашем канале Библиотека программиста. Затем мы свяжемся с победителем, который сам выберет смартфон. Тем, кто получит промокод, мы вышлем его в течение недели после окончания розыгрыша. ⚠️ Убедитесь, что вам можно написать в личные сообщения или следите за результатами — если мы не сможем с вами связаться, то не сможем и отправить приз. Доставить мы можем только в города России и Беларуси.