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

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

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

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

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
Что означает буква "L" в SOLID?

"L" — это принцип Liskov Substitution Principle (Принцип подстановки Барбары Лисков). Объекты должны быть заменяемыми экземплярами своих подтипов без изменения корректности программы. Это значит, что подклассы должны сохранять поведение родительских классов и не нарушать их контракт.

🧑‍💻 Пример:
Если класс Bird имеет метод fly(), и у нас есть подкласс Penguin, который не умеет летать, то создание такого подкласса нарушит принцип подстановки, так как он не поддерживает поведение родителя.
Please open Telegram to view this post
VIEW IN TELEGRAM
Чем отличается абстрактный класс от интерфейса?

Абстрактные классы и интерфейсы используются для обеспечения полиморфизма, но у них разные сценарии применения:

- Наследование: Абстрактный класс поддерживает единичное наследование, интерфейс — множественное.
- Реализация: Абстрактный класс может содержать поля и методы с реализацией. В то время как интерфейс (до Java 8) не мог иметь методы, после Java 8 в интерфейсах появились default методы. Поля в интерфейсах могут быть только public static final.
- Когда выбирать: Абстрактный класс — для объектов с общим поведением, интерфейсы — для описания возможностей или контрактов.


Абстрактные классы — это про кто я такой, интерфейсы — про что я могу делать.
Please open Telegram to view this post
VIEW IN TELEGRAM
ℹ️ Как устроен под капотом LinkedHashMap?

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

🔹 Структура LinkedHashMap

Основой LinkedHashMap является та же хэш-таблица, что и в HashMap, но с дополнительной структурой двусвязного списка для сохранения порядка элементов:

▪️ Каждая запись (entry) в LinkedHashMap содержит ссылки на предыдущий и следующий элементы. Это позволяет поддерживать порядок добавления или порядок последнего доступа.
▪️ Сначала выполняется хэширование ключей для быстрой вставки и поиска, как в HashMap, а уже потом запись связывается в список.

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

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

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

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

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

▪️ Преимущества:

- Сохранение порядка вставки: LinkedHashMap гарантирует, что элементы будут извлекаться в том порядке, в котором они были добавлены.
- Порядок доступа: Можно настроить LinkedHashMap на удаление самых старых элементов, что полезно для кэшей, где используется политика LRU (Least Recently Used).
- Предсказуемость итераций: В отличие от HashMap, где порядок элементов может изменяться, LinkedHashMap всегда сохраняет стабильный порядок.

▪️ Недостатки:

- Более высокое потребление памяти: Дополнительные ссылки на предыдущие и следующие элементы увеличивают память на каждую запись.
- Скорость: LinkedHashMap немного медленнее HashMap из-за поддержания порядка элементов.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое POJO класс?

POJO (Plain Old Java Object) — это объект Java, который не зависит от каких-либо специфичных библиотек или фреймворков. Он не реализует интерфейсы, не наследуется от конкретных классов и не использует аннотации. По сути, это обычный класс, который может содержать поля, геттеры/сеттеры и методы, но не содержит сложной логики, а его назначение — быть простым носителем данных.

POJO часто используется в рамках концепции, где важна чистота и независимость кода, например, в моделях данных для ORM или сериализации.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что означает буква "D" в SOLID?

"D" — это Dependency Inversion Principle (Принцип инверсии зависимостей). Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций. Абстракции не должны зависеть от деталей, но детали должны зависеть от абстракций.

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

Интерфейс не может быть final.

Модификатор final запрещает наследование или расширение классов, а интерфейсы по своей природе предназначены для того, чтобы быть реализованными другими классами. Поэтому интерфейсы не могут быть final, так как это противоречит их цели — служить контрактом, который может быть реализован.
Please open Telegram to view this post
VIEW IN TELEGRAM
Вакансии «Библиотеки программиста» — ждем вас в команде!

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

Подробности тут

Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴

Ждем ваших откликов 👾
👀 Задачи с собеседований: Реализация метода equals() (middle)

- Как правильно переопределить метод equals()?

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

▪️ Рефлексивность — объект должен быть равен самому себе.
▪️ Симметричность — если a.equals(b), то и b.equals(a) должно быть истинно.
▪️ Транзитивность — если a.equals(b) и b.equals(c), то a.equals(c) должно быть истинно.
▪️ Непротиворечивость — несколько вызовов метода equals() на одном и том же объекте должны возвращать одно и то же значение, если объекты не изменились.
▪️ null — вызов a.equals(null) должен возвращать false.

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

String Pool — это специальная область памяти в Java Heap, предназначенная для хранения строковых литералов. Когда создаётся строка, JVM проверяет, есть ли уже такая строка в пуле. Если она найдена, то возвращает ссылку на существующую строку, а если нет — добавляет её в пул. Это помогает уменьшить потребление памяти, так как одинаковые строковые литералы не создаются несколько раз.

Важно отметить, что строки, созданные с помощью new String(), не попадают в пул автоматически, их нужно туда добавлять вручную с помощью метода intern().
Please open Telegram to view this post
VIEW IN TELEGRAM
Что за принцип KISS?

Неверно: KISS – это принцип, который означает «делай максимально просто". Нужно всегда делать код минималистичным и без сложных конструкций и логики.

✔️ Правильный ответ: KISS (Keep It Simple, Stupid) — это принцип, который заключается в том, чтобы создавать как можно более простой и понятный код, избегая излишней сложности и чрезмерной абстракции. Его цель — сделать код легким для понимания и сопровождения. Однако KISS не означает упрощение до ущерба функциональности. Применение KISS требует правильного баланса между простотой и выполнением поставленных задач. Важно не путать упрощение с урезанием необходимого функционала или нарушением архитектуры.
Please open Telegram to view this post
VIEW IN TELEGRAM
Где лучше хранить пароль: в строке или в массиве символов?

Пароль лучше хранить в массиве символов, потому что:

- Строки в Java неизменяемы, и их нельзя явно удалить из памяти. Они остаются там до сборки мусора, что может привести к утечке пароля.
- Массив можно очистить вручную после использования (путём перезаписи значения), что даёт больший контроль над временем хранения данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Что такое пагинация, и зачем она нужна в работе с базой данных?

Пагинация — это техника разделения больших объемов данных на небольшие страницы для их поэтапной загрузки. Она особенно важна, когда мы работаем с большими таблицами, чтобы не загружать все записи сразу, что может привести к перегрузке памяти и увеличению времени обработки.
Please open Telegram to view this post
VIEW IN TELEGRAM
Зачем нужен enum?

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

Преимущества enum:

- Типобезопасность: Исключает ошибки, связанные с некорректными строковыми или числовыми значениями.
- Читаемость: Код становится более понятным, так как вместо магических чисел или строк используются осмысленные имена.
- Расширенные возможности: Можно добавлять методы и конструкторы, что делает enum мощнее, чем обычные константы.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️Разыгрываем флагманский смартфон

«Библиотека программиста» разыгрывает один из трех смартфонов на выбор:
🔹Samsung Galaxy S24 Ultra на 1 ТБ
🔹Xiaomi 14 Ultra на 512 ГБ
🔹iPhone 16 Pro Max на 512 ГБ

🔥 А еще 99 участников розыгрыша получат скидку 50% на наш курс Базовые модели ML и приложения!
Промокод будет действителен до 20 ноября.

Условия просты:
→ подписаться на Библиотека нейротекста
→ подписаться на Библиотека нейрозвука
→ подписаться на Библиотека нейрокартинок
→ нажать на кнопку «Участвовать» под этим постом

Итоги появятся 30 октября в 20:00 по московскому времени в нашем канале Библиотека программиста. Затем мы свяжемся с победителем, который сам выберет смартфон. Тем, кто получит промокод, мы вышлем его в течение недели после окончания розыгрыша.

⚠️ Убедитесь, что вам можно написать в личные сообщения или следите за результатами — если мы не сможем с вами связаться, то не сможем и отправить приз. Доставить мы можем только в города России и Беларуси.
ℹ️ Как устроен под капотом 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