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

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

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

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

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
December 17, 2024
👀 Задачи с собеседований: Поиск подмассива с максимальной суммой (middle)

— Дан массив целых чисел, необходимо найти подмассив с наибольшей суммой и вернуть эту сумму.

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

- Подмассив — это непрерывная последовательность элементов исходного массива.
- Требуется определить такую последовательность, сумма элементов которой максимальна.
- Эффективное решение задачи достигается с помощью алгоритма Кадане, который позволяет найти максимальную сумму подмассива за линейное время O(n).

Реализация на картинке 👆🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
December 18, 2024
Вакансии «Библиотеки программиста» — ждем вас в команде!

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

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

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

Ждем ваших откликов 👾
December 19, 2024
Какая разница между интерфейсами Runnable и Callable?

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

🔹 Runnableэто интерфейс, предназначенный для выполнения задачи, которая ничего не возвращает и не выбрасывает проверяемых исключений. Метод run() не имеет возвращаемого значения:

public interface Runnable {
void run();
}


🔹 Callableэто интерфейс, который используется для выполнения задачи, которая возвращает результат и может выбрасывать проверяемые исключения. Метод call() возвращает объект:

public interface Callable<V> {
V call() throws Exception;
}
Please open Telegram to view this post
VIEW IN TELEGRAM
December 19, 2024
Что такое Singleton Scope в Spring?

Singleton Scopeэто область видимости (scope) бина по умолчанию в Spring. Если бин настроен как @Scope("singleton") или не имеет явного указания области видимости, контейнер Spring создает только один экземпляр бина и возвращает его при каждом запросе.

Зачем нужен?

▪️ Экономия ресурсов: один экземпляр бина используется повторно, что снижает нагрузку на создание объектов.
▪️ Удобство управления состоянием: общие ресурсы или настройки можно легко разделить между всеми частями приложения.
▪️ Простота интеграции: Singleton-бин упрощает реализацию общесистемных сервисов, таких как кеширование, логирование, или подключения к базам данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
December 20, 2024
December 21, 2024
ℹ️ Что делает аннотация @Retention?

@Retention - это стандартная аннотация из пакета Java (java.lang.annotation.Retention). Аннотация задаёт политику удержания аннотаций, определяя, где и как долго аннотация будет доступна в процессе выполнения программы.

🔵 Политики удержания:

- RetentionPolicy.SOURCE - аннотация сохраняется только в исходном коде и отбрасывается компилятором. Она недоступна в байт-коде и во время выполнения.
- RetentionPolicy.CLASS - аннотация сохраняется в байт-коде, но недоступна в процессе выполнения через рефлексию. Это настройка по умолчанию, если @Retention не указана.
- RetentionPolicy.RUNTIME - аннотация сохраняется в байт-коде и доступна во время выполнения через рефлексию. Эта политика чаще всего используется в Spring для создания и обработки пользовательских аннотаций.

🔵 Пример:
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation {
String value();
}


В этом примере аннотация будет доступна для анализа во время выполнения, что позволяет Spring или другим библиотекам использовать её для настройки бинов, аспектов и других механизмов.
Please open Telegram to view this post
VIEW IN TELEGRAM
December 21, 2024
Что такое Propagation в Spring?

Propagation — это механизм, определяющий, как должна вести себя новая транзакция относительно уже существующей. Эта настройка управляет тем, будет ли новая транзакция создана, использована текущая или полностью проигнорирована.

🔹 Ключевые типы:

- REQUIRED (по умолчанию): использует текущую транзакцию, или создаёт новую, если её нет.
- REQUIRES_NEW: всегда создаёт новую транзакцию, приостанавливая текущую.
- NESTED: вложенная транзакция, откат которой не влияет на основную.
- SUPPORTS: использует текущую транзакцию, но работает без неё, если её нет.
- NOT_SUPPORTED: приостанавливает текущую транзакцию.
- NEVER: вызывает ошибку, если транзакция уже существует.
- MANDATORY: требует существования транзакции, иначе выбрасывает исключение.
Please open Telegram to view this post
VIEW IN TELEGRAM
December 22, 2024
Что такое ForkJoinPool и где его применяют?

ForkJoinPool — это пул потоков в Java, который работает по принципу "разделяй и властвуй". Он позволяет разбивать задачи на мелкие подзадачи (fork), выполнять их параллельно, а затем объединять результаты (join).

Особенность ForkJoinPool — использование алгоритма work-stealing, где потоки, простаивающие без работы, забирают задачи из очередей других потоков, что повышает производительность.

Где применяется:


- Рекурсивные вычисления (например, сортировка или суммирование).
- Параллельная обработка больших данных.
- Задачи, которые можно разделить на независимые подзадачи.
Please open Telegram to view this post
VIEW IN TELEGRAM
December 23, 2024
Что такое transient поля?

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

Пример:

class User implements Serializable {
private String username;
private transient String password;
}


Когда использовать:
- Для чувствительных данных, таких как пароли.
- Для временных или несущественных данных, которые не нужно сохранять.
Please open Telegram to view this post
VIEW IN TELEGRAM
December 24, 2024
Что такое Reflection?

Reflection — это механизм в Java, который позволяет вашему коду исследовать и изменять поведение классов, методов и объектов во время выполнения, даже если их структуры неизвестны заранее.

С помощью Reflection можно:

▪️ Узнавать информацию о классе (методы, поля, конструкторы, модификаторы).
▪️ Вызывать методы и обращаться к полям объекта, даже если они private.
▪️ Создавать новые объекты динамически (без явного указания конструктора).

Пример:


import java.lang.reflect.Method;

public class ReflectionExample {
public static void main(String[] args) throws Exception {
// Класс, который будем исследовать
Class<?> clazz = Class.forName("java.lang.String");

Method[] methods = clazz.getDeclaredMethods();

for (Method method : methods) {
System.out.println("Метод: " + method.getName());
}
}
}


⚠️ Важно:

- Reflection делает код менее безопасным и сложным для понимания.
- Это может снижать производительность программы. Используйте его только при необходимости.
- В современных приложениях, например, с Spring, Reflection часто используется для Dependency Injection или работы с аннотациями.
Please open Telegram to view this post
VIEW IN TELEGRAM
December 25, 2024
ℹ️ Какие типы ссылок существуют?

Существует 4 типа ссылок, которые определяют, как объект будет обрабатываться сборщиком мусора (Garbage Collector).

1️⃣ Strong Reference

Это ссылки, которые используются по умолчанию.
String strongRef = new String("Strong Reference");


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

2️⃣ Soft Reference

Создаются с помощью класса SoftReference. Soft ссылка удерживает объект в памяти, пока в JVM достаточно свободной памяти. Если памяти не хватает, объект будет удален.
SoftReference<String> softRef = new SoftReference<>(new String("Soft Reference"));
String softObj = softRef.get();


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

3️⃣ Weak Reference

Создаются с помощью класса WeakReference. Объект, на который ссылается слабая ссылка, удаляется сборщиком мусора, как только на него больше нет сильных или мягких ссылок.
WeakReference<String> weakRef = new WeakReference<>(new String("Weak Reference"));
String weakObj = weakRef.get();


Часто используются в структурах данных, таких как WeakHashMap, для предотвращения удержания ненужных объектов.
Удобны для создания ссылок на временные объекты.

4️⃣ Phantom Reference

Создаются с помощью класса PhantomReference. Эти ссылки используются исключительно для отслеживания, когда объект будет удален сборщиком мусора.
PhantomReference<String> phantomRef = new PhantomReference<>(new String("Phantom Reference"), new ReferenceQueue<>());


Метод get() у фантомной ссылки всегда возвращает null.
Объекты, на которые ссылаются фантомные ссылки, добавляются в ReferenceQueue, когда сборщик мусора их удаляет.
Please open Telegram to view this post
VIEW IN TELEGRAM
December 26, 2024
Чем отличаются интерфейсы Comparable и Comparator?

Интерфейсы Comparable и Comparator используются для сортировки объектов, но они различаются в подходе и сценариях использования.

🔹 Comparable определяет естественный порядок объектов. Реализуется самим классом, который нужно сравнивать.

Единственный метод – compareTo(T o):
@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age);
}


Удобно, когда у объекта есть однозначный критерий сравнения. Например, сортировка по возрасту

🔹 Comparator позволяет создавать кастомные способы сравнения, не изменяя класс.

Основной метод – compare(T o1, T o2):
Comparator<Person> byName = (p1, p2) -> p1.getName().compareTo(p2.getName());


Используется для различных критериев сравнения, например, сортировка по имени или другим атрибутам.
Please open Telegram to view this post
VIEW IN TELEGRAM
December 27, 2024
Что такое JRE?

JRE (Java Runtime Environment) — это компонент платформы Java, который обеспечивает выполнение Java-программ.

▪️ JRE включает:

- JVM (Java Virtual Machine): Отвечает за интерпретацию и выполнение байт-кода.
- Библиотеки и классы: Набор стандартных библиотек (например, java.lang, java.util), которые нужны для работы приложений.
- Файлы и ресурсы: Вспомогательные файлы, такие как конфигурации и системные библиотеки.

JRE используется для запуска уже скомпилированных Java-программ. Это значит, что JRE не включает компилятор и другие инструменты разработки (они есть в JDK).
Please open Telegram to view this post
VIEW IN TELEGRAM
December 28, 2024
December 29, 2024
Что такое JVM?

JVM (Java Virtual Machine) — это виртуальная машина, которая выполняет Java-программы. Она предоставляет платформо-независимую среду для работы Java-кода, абстрагируя аппаратные и операционные особенности.

▪️ Как работает JVM?

- Компиляция: Исходный код на Java компилируется в байт-код (.class), который понятен JVM.
- Загрузка: Класс-загрузчики (Class Loaders) загружают байт-код в память.
- Верификация: Верификатор проверяет байт-код на корректность и безопасность выполнения.
- Исполнение: JVM интерпретирует байт-код или передаёт его JIT-компилятору для преобразования в машинный код, что улучшает производительность.

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


- Garbage Collection: Автоматическое управление памятью для предотвращения утечек.
- Cross-Platform: "Write once, run anywhere" благодаря унифицированной спецификации JVM.
- Виртуальная среда: Обеспечивает безопасность, изолируя выполнение Java-программ.
Please open Telegram to view this post
VIEW IN TELEGRAM
December 29, 2024
💬 Обратная связь

🎄 Всех с наступающими праздниками.
Планируете ли Вы готовиться к собеседованиям на новогодних праздниках?

👍🏼 - Конечно, выкладывайте вопросы как раньше
🌚 - Буду отдыхать и веселиться. Выложите что-то ещё

Поделитесь в комментариях, что на новогодние было бы интересно почитать, помимо постов по тематике канала?
Please open Telegram to view this post
VIEW IN TELEGRAM
December 30, 2024
🎄 Как работает String.intern()

Метод String.intern() возвращает строку из пула строк (String Pool), если такая строка уже существует, либо добавляет строку в пул, если её там ещё нет. Это может быть полезно для оптимизации памяти, особенно при работе с большим количеством дублирующихся строк.

🔍 Как это работает:

String Pool — это специальная область памяти в JVM, где хранятся уникальные строковые литералы. Когда мы вызываем intern(), JVM ищет строку в пуле:

Если строка найдена, возвращается ссылка на неё.
Если строка не найдена, она добавляется в пул, и возвращается новая ссылка.

🧨 Опасности использования:


— Перегрузка пула строк:
Если бездумно вызывать intern() на огромном количестве уникальных строк, можно исчерпать доступную память.

— Скрытые проблемы многопоточности:
Если несколько потоков одновременно вызывают intern() на строке, это может привести к задержкам или даже к дедлокам в JVM.
Please open Telegram to view this post
VIEW IN TELEGRAM
December 31, 2024
December 31, 2024