Библиотека собеса по 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
加入频道
ℹ️ Как устроен под капотом 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
Чем отличается процесс от потока?

Процесс — это отдельная программа, выполняющаяся в своей выделенной области памяти. У каждого процесса есть собственное адресное пространство, и он изолирован от других процессов. Взаимодействие между процессами требует механизмов межпроцессного взаимодействия (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