Библиотека собеса по Java | вопросы с собеседований
6.36K subscribers
354 photos
4 videos
185 links
Вопросы с собеседований по Java и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/08c603b6

Работать у нас: https://job.proglib.io/

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
ℹ️ Как устроен под капотом 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 в качестве ключа, что ограничивает его использование в некоторых сценариях.
Please open Telegram to view this post
VIEW IN TELEGRAM
🧪 Чем заменить Postman: 5 отличных инструментов для разработки API

Postman долгое время был основным инструментом для разработки и тестирования API, но сейчас для большинства разработчиков его ограничения стали перевешивать преимущества. Рассмотрим альтернативные инструменты, которые могут предложить больше возможностей, чем Postman — даже в бесплатной версии.

👉Читаем здесь
Что означает буква "O" в SOLID?

"O" — это Open/Closed Principle (Принцип открытости/закрытости). Классы должны быть открыты для расширения, но закрыты для модификации. Это означает, что поведение класса можно изменять через наследование или реализацию интерфейсов, не изменяя его исходный код.

🧑‍💻 Пример:
Вместо изменения существующего класса для добавления новой функциональности, мы можем создать новый класс, который расширит существующий, сохраняя оригинальный код неизменным.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Нужна ли математика на собеседованиях?

🗓 Сегодня в 20:00 встречаемся в прямом эфире, чтобы обсудим роль математики на собеседовании, а также поделимся инсайдами как успешно пройти техническое собеседование! https://proglib.io/w/47174041

🌟 Спикер: Станислав Петров – Senior Data Scientist.

😮 На вебинаре вы узнаете:

😱 Ошибаться — не страшно. Как ошибки и неудачные проекты могут стать ценным опытом. Почему «проекты в стол» способствуют профессиональному росту. И как преодолеть путь от junior до senior.

🙌🏻 Собеседования: можно ли к ним не готовиться?! Поделимся эффективными стратегиями подготовки и расскажем, на что работодатели обращают внимание в первую очередь.

✍️ Разберем реальные тестовые задачи, которые дают на собеседованиях на позицию Data Scientist.

🎁 Бонус: расскажем как проводить эффективное тестирование в маркетинге и их масштабируемость.

🎯 Почему важно посетить вебинар?

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

• Расширьте свой профессиональный кругозор и подготовьтесь к новым карьерным вызовам.

👉 Присоединяйтесь к нам и узнайте, как математика может помочь в вашей карьере https://proglib.io/w/47174041
Чем отличается процесс от потока?

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

Поток (или "нить") — это "легковесная" единица выполнения, которая работает в рамках одного процесса и использует общую память этого процесса. В Java потоки одного процесса могут совместно использовать объекты и переменные, что значительно упрощает взаимодействие между ними по сравнению с процессами. Однако такая общая память влечет за собой риски, такие как состояния гонок и необходимость синхронизации, чтобы избежать конфликтов при одновременном доступе к ресурсам.
Please open Telegram to view this post
VIEW IN TELEGRAM
В чем основные различия между checked и unchecked исключениями?

Проверяемые исключения (Checked Exceptions) требуют обработки во время компиляции. Это исключения, которые происходят из класса Exception, но не являются подклассами RuntimeException. Нужно либо обрабатывать такие исключения с помощью try-catch, либо объявлять их в сигнатуре метода с ключевым словом throws. Их цель — предупредить ошибки, которые могут быть предсказаны, но неизбежны, например, проблемы с доступом к файлам.

Непроверяемые исключения (Unchecked Exceptions) включают в себя RuntimeException и его подклассы, такие как NullPointerException, IndexOutOfBoundsException и IllegalArgumentException. Эти исключения происходят во время выполнения и сигнализируют о логических ошибках в коде, которые обычно можно избежать, если правильно построить логику программы. Обработка таких исключений — выбор разработчика, поскольку они не проверяются компилятором и, как правило, возникают из-за ошибок программиста, которые не связаны с внешними условиями.
Please open Telegram to view this post
VIEW IN TELEGRAM
В чём разница между throw и throws?

- throws: указывается в сигнатуре метода, чтобы сообщить, какие исключения метод может выбросить. Например, если метод может генерировать FileNotFoundException, это указывается так:
public void readFile() throws FileNotFoundException { ... }


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

- throw: используется непосредственно в теле метода, чтобы выбросить конкретное исключение. Пример:
if (file == null) {
throw new FileNotFoundException("Файл не найден");
}


Здесь throw запускает исключение, когда возникает определённое условие.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое прокси-объект и для чего он используется?

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

- В Spring прокси-объекты часто создаются для применения аспектов (AOP), таких как логирование, транзакции или безопасность.
- В Hibernate прокси-объекты широко применяются для реализации ленивой загрузки.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое ClassLoader?

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

🔍 Основные типы ClassLoader:

Bootstrap ClassLoader — загружает основные библиотеки Java из JDK (например, java.lang.*, java.util.*).
Extension ClassLoader — загружает расширения или библиотеки, находящиеся в папке ext внутри JDK.
Application (System) ClassLoader — загружает классы, определенные в CLASSPATH приложения.

Каждый ClassLoader сначала пытается передать задачу загрузки родительскому класслоадеру, обеспечивая таким образом иерархическую структуру загрузки. Также позволяет запускать разные версии библиотек одновременно, предотвращая конфликты классов.
Please open Telegram to view this post
VIEW IN TELEGRAM
ℹ️ Как устроен под капотом 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.
- Ссылки на элементы создают определенные накладные расходы, а при увеличении массива корзин в процессе реасширения требуются дополнительные ресурсы.
Please open Telegram to view this post
VIEW IN TELEGRAM
Разница между итераторами fail-fast и fail-safe?

🔹 Fail-fast итераторы обнаруживают изменения в коллекции во время итерации (например, добавление или удаление элементов) и немедленно выбрасывают ConcurrentModificationException. Эти итераторы работают напрямую с исходной коллекцией и обеспечивают высокую производительность, но не защищены от одновременных модификаций. Примеры коллекций, поддерживающих fail-fast итераторы, — ArrayList, HashSet, HashMap.

🔹 Fail-safe итераторы, в свою очередь, создают копию коллекции для итерации, что позволяет обходить коллекцию, даже если в нее вносятся изменения во время обхода. Они защищены от ConcurrentModificationException, но требуют больше памяти и процессорных ресурсов. Примеры коллекций, поддерживающих fail-safe итераторы, — CopyOnWriteArrayList и ConcurrentHashMap.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое Garbage Collector?

Garbage Collector (GC) — это компонент JVM, который управляет памятью приложения. Он освобождает память, удаляя объекты, которые больше не используются, и к которым нет активных ссылок. Благодаря GC можно не заботиться о ручном освобождении памяти, как в некоторых других языках, что упрощает разработку и снижает риск утечек памяти.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое сериализация?

Сериализация — это процесс преобразования объекта в поток байтов для сохранения его состояния или передачи по сети. Этот процесс позволяет сохранять данные объекта и его связи с другими объектами, так что их можно восстановить (десериализовать) позже. Сериализация поддерживает версионность с помощью serialVersionUID, что помогает проверять совместимость классов при изменениях.
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
👀 Задачи с собеседований: Поиск первого уникального символа в строке (jun+)

— Как найти первый уникальный символ в строке?

💡 Ключевые моменты:

- Используйте доп. структуру данных для хранения количества вхождений каждого символа
- Предложите в комментарии другие варианты решения.

Реализация через Map на картинке 👆🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое Integration Tests?

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

Ключевые особенности:

🧩 Взаимодействие компонентов: Integration-тесты помогают выявить проблемы в интеграции разных модулей, таких как базы данных, внешние API и другие системные компоненты.

🌐 Зависимость от окружения: Часто требуют доступ к реальной или тестовой среде, например, к базе данных или к другим внешним ресурсам. Для изоляции и имитации окружения могут использоваться инструменты вроде Testcontainers и WireMock.

⏱️ Медленное выполнение: Интеграционные тесты занимают больше времени, чем unit-тесты, из-за необходимости взаимодействия с внешними системами. Поэтому их обычно выполняют реже — например, перед релизом или при существенных изменениях в коде.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое IoC?

IoC (Inversion of Control) — это принцип проектирования, при котором объекты не создают свои зависимости самостоятельно, а получают их извне, обычно через контейнер управления зависимостями. В Java одной из популярных реализаций этого принципа является Spring Framework, который использует IoC-контейнер для создания, связывания и управления жизненным циклом объектов приложения.

Основная идея IoC заключается в том, что контейнер берет на себя ответственность за инициализацию и конфигурацию объектов, позволяя разработчику сфокусироваться на логике приложения, а не на управлении зависимостями. Это достигается через Dependency Injection (DI) — механизм, при котором зависимости передаются объекту в момент его создания.
Please open Telegram to view this post
VIEW IN TELEGRAM
ℹ️ Какие виды тестирования существуют?

🧪 Unit-тесты: Проверяют работу отдельных, минимальных единиц кода, например, методов или классов, в изоляции. Основная цель — убедиться, что каждый отдельный модуль работает корректно.

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

🎭 End-to-End (E2E) тесты: Проверяют полную цепочку действий в приложении, начиная от пользовательского интерфейса и заканчивая бекендом и базой данных. Цель — убедиться, что вся система работает корректно от начала до конца.

🔄 Regression-тесты: Направлены на проверку, что новые изменения в коде не сломали существующую функциональность. Обычно включают в себя повторение уже существующих тестов.

🛠 Acceptance-тесты: Проверяют, соответствует ли функциональность приложения требованиям заказчика или конечного пользователя. Обычно проводятся на последнем этапе, перед выпуском продукта в продакшн.

💡 Performance-тесты: Оценивают производительность системы — время отклика, пропускную способность и поведение под нагрузкой. Помогают убедиться, что приложение остаётся стабильным при большом количестве запросов.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️Самые полезные каналы по Java в одной папке

В ней:
канал для подготовки к собеседованиям
интересные задачи
основной канал
книги по Java
лучшие вакансии из сферы
и наш чат, в котором можно общаться и задавать вопросы

Добавляйте 👉 тык сюда
Please open Telegram to view this post
VIEW IN TELEGRAM
ℹ️ Как устроен под капотом LinkedHashSet?

LinkedHashSet — это коллекция, обеспечивающая хранение уникальных элементов с сохранением порядка их вставки. LinkedHashSet, как и HashSet, работает с элементами за амортизированное O(1) время, но, в отличие от HashSet, сохраняет порядок добавления элементов благодаря дополнительной структуре связного списка.

🔹 Структура LinkedHashSet

LinkedHashSet базируется на HashMap, но имеет уникальную особенность — упорядочивание элементов за счёт использования связного списка поверх стандартной хеш-таблицы.

▪️ Хранение данных: LinkedHashSet использует LinkedHashMap для хранения элементов. Каждый добавляемый элемент выступает в роли ключа, а значение всегда фиксировано (обычно это объект-заглушка).
▪️ Связный список: Для поддержания порядка добавления, элементы связаны друг с другом в виде двусвязного списка. Это позволяет итерациям проходить элементы в порядке их вставки.
▪️ Уникальность элементов: Как и в HashSet, каждый элемент уникален. При попытке добавить дублирующий элемент он игнорируется, сохраняя уникальность всех значений.

🔹 Производительность

▪️ Добавление: Добавление элементов происходит за амортизированное O(1) время. LinkedHashSet вычисляет хэш элемента и индекс, где он будет храниться в массиве бакетов LinkedHashMap.
▪️ Удаление: Удаление происходит также за амортизированное O(1) время. LinkedHashSet находит элемент по хэшу, удаляет его из связного списка и освобождает место в корзине.
▪️ Поиск: Поиск происходит за амортизированное O(1) время благодаря хэш-таблице.

🔹 Использование памяти

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

🔹 Преимущества и недостатки

▪️ Преимущества:
- Сохранение порядка добавления элементов.
- Быстрая работа с элементами за амортизированное O(1) время, как и в HashSet.

▪️ Недостатки:
- Потребление ресурсов возрастает при большом количестве элементов, так как структура требует больше памяти для поддержания порядка.
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀🐘 Оптимизация хранимых процедур в PostgreSQL: 4 трюка для взрывного ускорения

Кто из нас не сталкивался с медленными хранимыми процедурами в PostgreSQL? Наверняка таких мало. Сегодня поговорим о том, как реально ускорить их работу. Никакой сухой теории — только проверенные на практике методы. Разберем, как анализировать запросы, правильно использовать индексы и применять другие хитрости, которые действительно работают.

Читать статью