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

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

الذهاب إلى القناة على Telegram

Вопросы с собеседований по Java и ответы на них. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/08c603b6 Для обратной связи: @proglibrary_feeedback_bot

إظهار المزيد
6 494
المشتركون
+324 ساعات
+147 أيام
+1930 أيام
أرشيف المشاركات
Новые форматы (можно выбрать несколько):
Anonymous voting

Привет, друзья! Какие форматы кроме обычных вопросов вам бы ещё было интересно увидеть? Пишите в комментариях. 💬 Также ниже предлагаю несколько вариантов готовых форматов. Можем обсудить: какие лучше, какие хуже и как интересно реализовать их. Сделаем контент ещё интереснее вместе🔼

ℹ️ Как устроен под капотом LinkedList? LinkedList — это двусвязный список, который реализует интерфейсы List, Deque и Queue, обеспечивая гибкость в работе с элементами на обоих концах структуры. 🔹 Структура LinkedList LinkedList хранит свои элементы в виде узлов (Nodes), каждый из которых содержит три части: ▪️ Ссылку на предыдущий узел ▪️ Ссылку на следующий узел ▪️ Само значение элемента Каждый узел существует разрозненно в памяти, в отличие от массивов, где все элементы хранятся последовательно. Это позволяет LinkedList динамически изменять размер и не требует перераспределения памяти при добавлении новых элементов. 🔹 Производительность ▪️ Добавление: При добавлении нового элемента создается новый узел, который вставляется между двумя существующими узлами, изменяя у них ссылки. Если добавление происходит в начало или конец, обновляются только ссылки на предыдущий или следующий узел. Операции на концах занимают O(1), тогда как добавление в середину требует прохождения списка до нужного узла, что занимает O(n). ▪️ Удаление: Удаление элемента работает аналогично добавлению — обновляются ссылки соседних узлов. Удаление на концах списка занимает O(1), в середине — O(n). ▪️ Поиск: Поскольку узлы хранятся в памяти разрозненно, LinkedList не поддерживает эффективный случайный доступ. Чтобы найти элемент, нужно последовательно проходить список от начала или конца, из-за чело сложность поиска O(n). 🔹 Использование памяти LinkedList требует дополнительной памяти для хранения двух ссылок (на предыдущий и следующий узел) для каждого элемента, что делает его более затратным по памяти по сравнению с массивами или ArrayList. 🔹 Преимущества и недостатки ▪️ Преимущества: Эффективные операции добавления и удаления в начале и конце списка, отсутствие необходимости в перераспределении памяти. Полезен для реализации очередей и стеков. ▪️ Недостатки: Медленный доступ к элементам (O(n)), высокий расход памяти из-за хранения ссылок, элементы хранятся разрозненно в памяти, что может приводить к фрагментации.

Для чего аннотация @Disabled в JUnit 5? Аннотация @Disabled отключает тест или класс тестов. Это полезно, если тест временно не должен выполняться. Можно также указать причину отключения для лучшего понимания. Пример в комментариях.

Какие есть методы в классе Object? public boolean equals(Object obj) — служит для сравнения объектов по значению; int hashCode() — возвращает hash код для объекта; String toString() — возвращает строковое представление объекта; Class getClass() — возвращает класс объекта во время выполнения; protected Object clone() — создает и возвращает копию объекта; void notify() — возобновляет поток, ожидающий монитор; void notifyAll() — возобновляет все потоки, ожидающие монитор; void wait() — остановка вызвавшего метод потока до момента пока другой поток не вызовет метод notify() или notifyAll() для этого объекта; protected void finalize() — может вызываться сборщиком мусора в момент удаления объекта при сборке мусора.

💻🔍💼 Кризис IT-рынка: как джуны и кадровый голод меняют правила игры В условиях нехватки опытных специалистов и наплыва джу
💻🔍💼 Кризис IT-рынка: как джуны и кадровый голод меняют правила игры В условиях нехватки опытных специалистов и наплыва джунов, IT-компании вынуждены искать нестандартные подходы к найму. Рассмотрим основные тренды и стратегии адаптации рынка. Читать статью #почитать

Можно ли переопределить метод toString() для Enum? Да, можно переопределить метод toString() в Enum так же, как и в любом другом классе. По умолчанию toString() для Enum возвращает имя перечисления (то, что задано при объявлении). Однако, если вам нужно вернуть другое значение, вы можете переопределить этот метод в вашем перечислении. Например, если переопределить toString(), можно для Day.MONDAY.toString() получить "Понедельник", вместо "MONDAY". Пример в комментариях.

Тестовое собеседование на Middle Java-разработчика завтра Уже завтра, 25 сентября в 19:00 по мск приходи онлайн на открытое с
Тестовое собеседование на Middle Java-разработчика завтра Уже завтра, 25 сентября в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика. Как это будет: 1. Мария Ядерцова ведущий Java-разработчик в МТС Диджитал и ex. Сбербанк-Технологии будет задавать реальные вопросы и задачи разработчику-добровольцу 2. Мария будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 3. В конце можно будет задать любой вопрос Марии Что узнаешь на прямом эфире от ШОРТКАТ: · Чего ждут от кандидатов на Middle позиции в Java-разработке · Какие вопросы задают на интервью и зачем · Как подготовиться к собесу, чтобы получить оффер Это бесплатно? Бесплатно Переходи в нашего бота, чтобы получить ссылку на эфир@shortcut_sh_bot Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzqxQR25W

🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи Напоминаем, что у нас есть бесплатный курс для всех, кто хо
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом. Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций. Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах. 👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.

Какие есть способы создания объекта String? ▪️ Литерал строки: Это наиболее распространённый способ. При создании строки с помощью литерала, объект помещается в String Pool, и если строка уже существует в пуле, то повторное создание этой строки не происходит. ```java String str1 = "Hello";``` ▪️ Конструктор класса String: Создание строки с использованием оператора new. При этом всегда создаётся новый объект в памяти, даже если строка уже существует. ```java String str2 = new String("Hello");``` ▪️ Метод valueOf(): Этот метод преобразует аргумент в строку. Например, передавая число или другой тип данных, он вернёт строковое представление. ```java String str3 = String.valueOf(123);```

ℹ️ Что такое состояние гонки 🏎 Состояние гонки (Race Condition) — это ситуация, когда несколько потоков одновременно получают доступ к общему ресурсу без должной синхронизации. В результате поведение программы становится непредсказуемым, так как порядок выполнения потоков может влиять на конечный результат. Пример:
public class RaceConditionStringBuilder {
    public static void main(String[] args) throws InterruptedException {
        StringBuilder sb = new StringBuilder(); // Общий ресурс

        Runnable task = () -> {
            for (int i = 0; i < 10000; i++) {
                sb.append("A"); // Несинхронизированный доступ
            }
        };

        Thread t1 = new Thread(task);
        Thread t2 = new Thread(task);

        t1.start();
        t2.start();

        t1.join();
        t2.join();

        System.out.println("Result length: " + sb.length());
    }
}
👀 Что происходит? ▪️ Два потока одновременно добавляют символ "A" в один и тот же StringBuilder объект. Поскольку StringBuilder не является потокобезопасным, возможны ошибки, такие как потеря данных или некорректные результаты. ▪️ Потоки не знают о действиях друг друга. Если два потока одновременно читают строку длиной 500, каждый добавляет свой символ "A", а затем оба записывают новую строку с длиной 501, одно добавление теряется. Это и есть состояние гонки — результат зависит от того, как потоки "успеют" выполнить свои операции. ▪️ Ожидаемая длина строки — 20000, но на практике результат может быть меньше. 🛠 Как исправить? 🔵 Использовать StringBuffer, который синхронизирован и потокобезопасен. 🔵 Синхронизировать доступ к StringBuilder вручную:
synchronized(sb) {
    sb.append("A");
}

Что такое this? this — это ключевое слово в Java, которое ссылается на текущий объект внутри его метода или конструктора. Важно: в static методах и контексте нельзя использовать this, так как они не привязаны к конкретному экземпляру класса.

ℹ️ Как устроен под капотом HashSet? HashSet — это реализация множества (set), которое не допускает дублирующихся элементов. В его основе используется механизм хеширования для быстрого поиска, добавления и удаления элементов. 🔹 Хеш-таблица как основа В основе HashSet лежит HashMap. Каждый элемент множества хранится в качестве ключа внутри объекта HashMap, а его значение всегда фиксированное — это специальный объект-заглушка. Этот объект используется для обозначения присутствия элемента, так как HashMap требует наличие пары "ключ-значение". 🔹 Хеширование Когда вы добавляете элемент в HashSet, для него вычисляется хеш-код с помощью метода hashCode(). Этот хеш-код помогает определить, в какую "корзину" (bucket) поместится элемент. Если два элемента имеют одинаковый хеш-код (коллизия), они будут помещены в один и тот же бакет, и далее будут различаться с помощью метода equals(). 🔹 Коллизии и структура бакета До Java 8, если в бакет попадало несколько элементов (коллизия), они сохранялись в виде односвязного списка. Это приводило к тому, что в худшем случае производительность поиска и добавления элементов могла падать до O(n), если список становился слишком длинным. С Java 8 при превышении 8 элементов в одном бакете, односвязный список преобразуется в красно-чёрное дерево, что улучшает производительность операций до O(log n). Когда количество элементов в бакете падает ниже 6, структура снова преобразуется обратно в связанный список для экономии памяти. 🔹 Добавление элементов ▪️ В среднем: добавление элемента занимает O(1), потому что благодаря хеш-кодам можно быстро находить нужную корзину для элемента. ▪️ В худшем случае: добавление элемента может занять O(n) до Java 8 (связный список) и O(log n) начиная с Java 8 (красно-чёрное дерево). 🔹 Удаление элементов Удаление происходит также через хеш-код: ищется соответствующая корзина, а затем элемент удаляется, если он там есть. Сложность удаления аналогична добавлению: O(1) в среднем и O(n) или O(log n) в худшем случае (в зависимости от структуры бакета). 🔹 Преимущества и недостатки ▪️ Преимущества: Быстрое добавление, удаление и поиск элементов в среднем за O(1), так как используется хеширование. Улучшенная производительность с Java 8 благодаря использованию красно-чёрного дерева. ▪️ Недостатки: Не гарантирует порядок элементов, а при частых коллизиях, особенно в старых версиях Java, производительность может падать до O(n).

Что такое Unit Tests? Unit-тесты — это тесты, которые проверяют работу отдельных, минимальных единиц кода (обычно это отдельные методы или классы). Они помогают убедиться, что каждый модуль работает корректно в изоляции от других. Ключевые особенности: 🧩 Изоляция: Unit-тесты должны быть независимы от внешних зависимостей, таких как базы данных или сетевые запросы. Для этого используются такие техники, как mocking (например, с помощью Mockito). 🚀 Быстрота выполнения: Unit-тесты должны выполняться быстро. Если тест медленный, это признак, что он может быть слишком сложным или зависим от внешних ресурсов. 🔄 Покрытие кода: Основная цель unit-тестов — максимальное покрытие ключевой логики программы, но не за счёт избыточности. Правильный баланс между покрытием и поддерживаемостью критически важен.

🙌 Хардкорный вышмат для тех, кто интересуется ML, AI, DS Начать с вводных занятий можно здесь, ответив всего на 4 вопроса –
🙌 Хардкорный вышмат для тех, кто интересуется ML, AI, DS Начать с вводных занятий можно здесь, ответив всего на 4 вопроса – https://proglib.io/w/12f47906 Что будет на демо? 🔹Вводный урок от CPO курса; 🔹Лекции со всеми преподавателями МГУ по темам: теория множеств, непрерывность функции, основные формулы комбинаторики, матрицы и операции над ними, градиентный спуск; 🔹Практические задания и дополнительные материалы! ⚡️Переходите и активируйте – https://proglib.io/w/12f47906

❗Вакансии «Библиотеки программиста» — ждем вас в команде! Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем: 👉контент-менеджеров для ведения телеграм-каналов Подробности тут Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴 Ждем ваших откликов 👾

Какая разница между java.util.Collection и java.util.Collections? 🔵 java.util.Collection — это интерфейс, который является основой для всех коллекций в Java. Он определяет общие методы, такие как add(), remove(), size(), и служит для работы с коллекциями объектов. Реализуется такими классами, как ArrayList, HashSet и другими. Когда нужно работать с базовыми операциями коллекций — добавление, удаление, проверка размера и т. д. 🔵 java.util.Collectionsэто утилитарный класс, который предоставляет набор статических методов для работы с коллекциями. Эти методы позволяют сортировать коллекции, синхронизировать их или возвращать неизменяемые версии коллекций. Когда нужно выполнять операции над коллекциями, такие как сортировка, синхронизация или создание неизменяемых коллекций. 🚀 Главное отличие: Collection — это интерфейс, определяющий поведение коллекций. Collections — это класс, предоставляющий вспомогательные методы для работы с коллекциями.

Что такое bytecode? Bytecode — это набор инструкций, которые виртуальная машина Java (JVM) использует для выполнения программ. При компиляции Java-код, не превращается сразу в машинный код, а сначала в bytecode. JVM переводит этот bytecode в машинный код уже во время исполнения программы, что делает Java независимой от платформы — один и тот же байт-код может быть выполнен на любой системе, где есть JVM. ⚙️ Этот подход позволяет добиться переносимости Java-приложений на различные операционные системы без изменения исходного кода.

ℹ️ Как устроен под капотом ArrayList? ArrayList — это реализация динамического массива в Java. Он базируется на массиве, который может изменять свой размер по мере добавления элементов. 🔹 Массив как основа В основе ArrayList лежит массив типа Object[]. Этот массив инициализируется с начальной емкостью (по умолчанию 10, если не указано иное). 🔹 Динамическое изменение размера Когда добавляется элемент, а текущий массив заполнен, ArrayList расширяет массив, создавая новый с увеличенной емкостью — обычно это 1.5x от текущего размера. Старые данные копируются в новый массив с помощью System.arraycopy. 🔹 Добавление элементов ▪️ В среднем: добавление элемента занимает O(1), потому что в большинстве случаев просто добавляется новый элемент в конец массива, без необходимости его увеличения. ▪️ В худшем случае: добавление элемента может занять O(n), потому что, если внутренний массив переполняется, ArrayList вынужден создать новый массив большего размера и скопировать в него все существующие элементы. 🔹 Удаление элементов При удалении элемента сдвигаются все последующие элементы на одну позицию влево, что приводит к сложностям: ▪️ Удаление по индексу: O(n) в худшем случае (сдвиг элементов после удаленного). ▪️ Удаление последнего элемента: O(1). 🔹Преимущества и недостатки ▪️ Преимущества: Быстрое добавление в конец, быстрый доступ по индексу O(1). ▪️ Недостатки: Медленное удаление или вставка в середине массива O(n), особенно при работе с большими коллекциями.