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

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

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

Для обратной связи: @proglibrary_feeedback_bot
加入频道
Что такое this?

this — это ключевое слово в Java, которое ссылается на текущий объект внутри его метода или конструктора.

Важно: в static методах и контексте нельзя использовать this, так как они не привязаны к конкретному экземпляру класса.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍143🔥3
ℹ️ Что такое состояние гонки

🏎 Состояние гонки (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");
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍114🔥4
ℹ️ Какие есть способы создания объекта String?

▪️ Литерал строки:

Это наиболее распространённый способ. При создании строки с помощью литерала, объект помещается в String Pool, и если строка уже существует в пуле, то повторное создание этой строки не происходит.

String str1 = "Hello";


▪️ Конструктор класса String:

Создание строки с использованием оператора new. При этом всегда создаётся новый объект в памяти, даже если строка уже существует.

String str2 = new String("Hello");


▪️ Метод valueOf():

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

String str3 = String.valueOf(123);
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤‍🔥3🔥2
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Можно ли переопределить метод toString() для Enum?

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

Например, если переопределить toString(), можно для Day.MONDAY.toString() получить "Понедельник", вместо "MONDAY".


Пример в комментариях.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥2🎉1
💻🔍💼 Кризис IT-рынка: как джуны и кадровый голод меняют правила игры

В условиях нехватки опытных специалистов и наплыва джунов, IT-компании вынуждены искать нестандартные подходы к найму. Рассмотрим основные тренды и стратегии адаптации рынка.

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

#почитать
👍3😁3🔥1
Какие есть методы в классе 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() — может вызываться сборщиком мусора в момент удаления объекта при сборке мусора.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍5🎉2🤩1
Для чего аннотация @Disabled в JUnit 5?

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

Пример в комментариях.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥1🎉1
ℹ️ Как устроен под капотом LinkedList?

LinkedList — это двусвязный список, который реализует интерфейсы List, Deque и Queue, обеспечивая гибкость в работе с элементами на обоих концах структуры.

🔹 Структура LinkedList


LinkedList хранит свои элементы в виде узлов (Nodes), каждый из которых содержит три части:

▪️ Ссылку на предыдущий узел
▪️ Ссылку на следующий узел
▪️ Само значение элемента

Каждый узел существует разрозненно в памяти, в отличие от массивов, где все элементы хранятся последовательно. Это позволяет LinkedList динамически изменять размер и не требует перераспределения памяти при добавлении новых элементов.

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

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

🔹 Использование памяти
LinkedList требует дополнительной памяти для хранения двух ссылок (на предыдущий и следующий узел) для каждого элемента, что делает его более затратным по памяти по сравнению с массивами или ArrayList.

🔹 Преимущества и недостатки
▪️ Преимущества: Эффективные операции добавления и удаления в начале и конце списка, отсутствие необходимости в перераспределении памяти. Полезен для реализации очередей и стеков.
▪️ Недостатки: Медленный доступ к элементам (O(n)), высокий расход памяти из-за хранения ссылок, элементы хранятся разрозненно в памяти, что может приводить к фрагментации.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥3🎉1
Привет, друзья!

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

Сделаем контент ещё интереснее вместе🔼
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍1🎉1
С помощью чего создаётся новый объект?

Неверно: Конструктор.

✔️ Правильный ответ: Объекты создаются с помощью оператора new, конструктор лишь инициализирует объект после его создания.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22👏3🔥2
Чем отличается переопределение от перегрузки?

И переопределение (override), и перегрузка (overload) — это формы полиморфизма в Java, но они работают по-разному.

🔹 Переопределение происходит, когда подкласс изменяет реализацию метода, унаследованного от родительского класса. Метод должен иметь ту же сигнатуру (имя, параметры и возвращаемый тип). Это форма динамического полиморфизма, потому что выбор метода происходит во время выполнения.

🔹 Перегрузка — это создание нескольких методов с одинаковым именем, но с разными параметрами (их типами, количеством или порядком). Это форма статического полиморфизма, так как выбор метода происходит на этапе компиляции.

⚠️ Смена только возвращаемого типа метода не считается перегрузкой. Если у методов совпадают имя и параметры, но различаются только возвращаемые типы, это вызовет ошибку компиляции.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍82👏1🤔1
Какой код компилируется быстрее: код с комментариями или без?

Комментарии никак не влияют на скорость компиляции. Компилятор игнорирует комментарии при сборке программы, так как они предназначены только для разработчиков. В процессе компиляции комментарии удаляются, и на итоговое скомпилированное приложение они не оказывают никакого влияния.

Документация.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍171🔥1😁1
Можно ли наследоваться от класса String?

Нет, наследоваться от класса String нельзя. Это связано с тем, что класс String объявлен как final, а это значит, что он не может быть расширен или изменен посредством наследования.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍223🔥2
Что такое инкапсуляция?

Неверно: Это когда все поля класса объявляются приватными и создаются геттеры и сеттеры.

✔️ Правильный ответ: Инкапсуляция — это принцип ООП, при котором детали реализации скрываются от внешнего мира, предоставляя доступ к данным только через публичные методы (геттеры/сеттеры или другие). Она позволяет защитить данные от некорректных изменений и обеспечить контролируемый доступ к ним.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍172🔥2😁2
Что означает буква "S" в SOLID?

"S" — это Single Responsibility Principle (Принцип единственной ответственности). Каждый класс или модуль должен иметь одну и только одну причину для изменения, то есть отвечать только за одну задачу.

🧑‍💻 Пример:
Класс, который отвечает за обработку данных, не должен также отвечать за их отображение или сохранение. Нарушение этого принципа может привести к усложнению кода и трудностям с поддержкой.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥31
ℹ️ Как устроен под капотом TreeSet?

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

🔹 Структура TreeSet

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

▪️ Каждый узел содержит ключ и ссылки на дочерние узлы
▪️ Дерево автоматически сбалансировано — максимальная глубина любого пути от корня к листу в два раза меньше самой длинной возможной
▪️ Элементы располагаются в отсортированном порядке по мере добавления, что гарантирует логарифмическую сложность поиска и вставки

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

▪️ Добавление: При добавлении элемента дерево балансируется, чтобы соблюсти свойства красно-черного дерева. Это обеспечивает сложность добавления O(log n).
▪️ Удаление: Работает схожим образом — дерево ребалансируется, а ссылки между узлами корректируются. Удаление также выполняется за O(log n).
▪️ Поиск: Благодаря сбалансированной структуре, поиск элемента в TreeSet занимает O(log n), что делает его быстрее, чем линейный поиск в несбалансированных структурах.

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

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

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

▪️ Преимущества:
- Гарантированный порядок элементов: В отличие от HashSet, TreeSet хранит элементы в отсортированном виде. Это важно, если нужно быстро получать минимальные, максимальные или средние значения без дополнительной сортировки. Также можно извлекать диапазоны значений с помощью методов вроде subSet().
- Навигационные методы: TreeSet предоставляет мощные инструменты для навигации по набору, такие как методы для поиска ближайших элементов (floor(), ceiling()), что делает его удобным для задач с диапазонами данных.
▪️ Недостатки:
- Производительность: Операции в TreeSet медленнее, чем в HashSet.
- Большие накладные расходы по памяти: Для каждого элемента TreeSet требуется хранить дополнительные ссылки на дочерние узлы, что увеличивает потребление памяти.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥6🎉21
👋🏭 От Hello World до Enterprise: 15 Java-проектов для начинающих и профессионалов

Ищете интересные идеи для Java-проектов? Можно начать с простых вещей, вроде создания чат-бота или текстового редактора, а затем усложнить задачи, взяв на себя разработку маркетплейса или системы онлайн-обучения. Эти идеи охватывают различные технологии, от баз данных и многопоточности до веб-сервисов и микросервисов. Воплощая их, вы сможете существенно улучшить свои навыки и добавить в портфолио проекты, которые привлекут внимание работодателей.

🔗 Ссылка на статью
👍8🔥32❤‍🔥1
Что такое сигнатура метода?

Неверно: это его имя, возвращаемый тип, модификаторы доступа и список параметров.

✔️ Правильный ответ: Сигнатура метода — это комбинация его имени и списка параметров (типов и порядка). Она используется для уникальной идентификации методов в классе. Важно, что возвращаемый тип и модификаторы доступа не являются частью сигнатуры.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥7🎉2