Java | Вопросы собесов
Cайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+icUwivvbGOkwNWRi Задачи t.me/+8eqUTboisnkyZjQy Вакансии t.me/+4pspF5nDjgM4MjQy
Больше📈 Аналитический обзор Telegram-канала Java | Вопросы собесов
Канал Java | Вопросы собесов (@easy_java_ru) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 11 453 подписчиков, занимая 10 900 место в категории Технологии и приложения и 57 494 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 11 453 подписчиков.
Согласно последним данным от 09 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило 13, а за последние 24 часа — -1, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 10.15%. В первые 24 часа после публикации контент обычно набирает 7.30% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 1 162 просмотров. В течение первых суток публикация набирает 836 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 6.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как ставь, void, string, строка, static.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Cайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp
Тесты t.me/+icUwivvbGOkwNWRi
Задачи t.me/+8eqUTboisnkyZjQy
Вакансии t.me/+4pspF5nDjgM4MjQy”
Благодаря высокой частоте обновлений (последние данные получены 10 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
BiConsumer<T, U> — это функциональный интерфейс из пакета java.util.function, который принимает два входных аргумента и не возвращает результат.
Сигнатура BiConsumer<T, U>
@FunctionalInterface
public interface BiConsumer<T, U> {
void accept(T t, U u);
}
🚩Вывод пар значений
Допустим, у нас есть Map<String, Integer>, и мы хотим вывести все ключи и значения:
import java.util.Map;
import java.util.function.BiConsumer;
public class BiConsumerExample {
public static void main(String[] args) {
Map<String, Integer> map = Map.of("Alice", 30, "Bob", 25, "Charlie", 35);
// Используем BiConsumer для вывода ключа и значения
BiConsumer<String, Integer> printEntry = (key, value) ->
System.out.println("Имя: " + key + ", возраст: " + value);
// Применяем BiConsumer к каждому элементу Map
map.forEach(printEntry);
}
}
Вывод
Имя: Alice, возраст: 30 Имя: Bob, возраст: 25 Имя: Charlie, возраст: 35🚩Использование `BiConsumer` в `Stream` Допустим, у нас есть список продуктов и их цены. Мы хотим увеличить цену каждого товара и напечатать результат.
import java.util.*;
import java.util.function.BiConsumer;
public class BiConsumerStreamExample {
public static void main(String[] args) {
Map<String, Double> products = new HashMap<>();
products.put("Хлеб", 50.0);
products.put("Молоко", 80.0);
products.put("Яблоки", 120.0);
// BiConsumer, который увеличивает цену и выводит её
BiConsumer<String, Double> increaseAndPrint = (name, price) -> {
double newPrice = price * 1.1; // +10%
System.out.println(name + " теперь стоит " + newPrice);
};
products.forEach(increaseAndPrint);
}
}
Вывод
Хлеб теперь стоит 55.0 Молоко теперь стоит 88.0 Яблоки теперь стоят 132.0🚩Объединение `BiConsumer` с `andThen()` Метод
andThen(BiConsumer<T, U>) позволяет объединять несколько действий в цепочку.
import java.util.function.BiConsumer;
public class BiConsumerChaining {
public static void main(String[] args) {
BiConsumer<String, Integer> printUser = (name, age) ->
System.out.println("Пользователь: " + name + ", возраст: " + age);
BiConsumer<String, Integer> checkAdult = (name, age) ->
System.out.println(name + (age >= 18 ? " совершеннолетний" : " несовершеннолетний"));
// Объединяем два BiConsumer'а
BiConsumer<String, Integer> combined = printUser.andThen(checkAdult);
combined.accept("Алексей", 20);
combined.accept("Мария", 16);
}
}
Вывод:
Пользователь: Алексей, возраст: 20 Алексей совершеннолетний Пользователь: Мария, возраст: 16 Мария несовершеннолетнийСтавь 👍 и забирай 📚 Базу знаний
java.util (например, ArrayList, HashMap, HashSet) не потокобезопасны. Чтобы использовать их в многопоточной среде, можно применять синхронизированные обёртки** и **коллекции из java.util.concurrent.
🚩Синхронизация с `Collections.synchronizedXXX()`
Java предоставляет методы для создания потокобезопасных обёрток над обычными коллекциями:
import java.util.*;
public class SynchronizedCollectionsExample {
public static void main(String[] args) {
List<Integer> syncList = Collections.synchronizedList(new ArrayList<>());
Map<String, String> syncMap = Collections.synchronizedMap(new HashMap<>());
Set<Integer> syncSet = Collections.synchronizedSet(new HashSet<>());
syncList.add(1);
syncMap.put("key", "value");
syncSet.add(10);
}
}
🚩Важный момент: Итерация через `synchronized` коллекции
Даже если коллекция синхронизирована, её итерация не потокобезопасна.
for (Integer num : syncList) { // Возможен ConcurrentModificationException!
System.out.println(num);
}
Чтобы избежать ошибок, итерацию нужно делать внутри synchronized блока
synchronized (syncList) {
for (Integer num : syncList) {
System.out.println(num);
}
}
🚩Коллекции из `java.util.concurrent` (рекомендуемый вариант)
Вместо Collections.synchronizedXXX() лучше использовать современные конкурентные коллекции из java.util.concurrent. Они спроектированы для многопоточности и работают быстрее.
import java.util.concurrent.*;
public class ConcurrentMapExample {
public static void main(String[] args) {
ConcurrentMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
concurrentMap.put("one", 1);
concurrentMap.put("two", 2);
System.out.println(concurrentMap.get("one")); // 1
}
}
Пример CopyOnWriteArrayList (потокобезопасный список, работающий через копии)
import java.util.concurrent.CopyOnWriteArrayList;
public class CopyOnWriteExample {
public static void main(String[] args) {
CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
list.add(1);
list.add(2);
for (Integer num : list) { // Без ConcurrentModificationException!
System.out.println(num);
}
}
}
Ставь 👍 и забирай 📚 Базу знанийList — это интерфейс, а его самые популярные реализации — ArrayList и LinkedList. Они имеют разную структуру данных, что влияет на производительность и область применения.
🚩Структура данных
ArrayList использует динамический массив, который хранит элементы в непрерывной области памяти.
LinkedList — это двусвязный список, где каждый элемент (Node) содержит ссылку на предыдущий и следующий элементы.
🚩Использование памяти
ArrayList требует непрерывного блока памяти, что может быть проблемой при нехватке места.
LinkedList требует дополнительной памяти на хранение ссылок (prev и next), что увеличивает общий размер.
Пример кода: разница в скорости вставки в середину списка
import java.util.*;
public class ListComparison {
public static void main(String[] args) {
List<Integer> arrayList = new ArrayList<>();
List<Integer> linkedList = new LinkedList<>();
int size = 100000;
// Заполнение списков
for (int i = 0; i < size; i++) {
arrayList.add(i);
linkedList.add(i);
}
// Вставка в середину
long start = System.nanoTime();
arrayList.add(size / 2, 999);
long end = System.nanoTime();
System.out.println("ArrayList вставка в середину: " + (end - start) + " нс");
start = System.nanoTime();
linkedList.add(size / 2, 999);
end = System.nanoTime();
System.out.println("LinkedList вставка в середину: " + (end - start) + " нс");
}
}
Ставь 👍 и забирай 📚 Базу знанийInterruptedException — это проверяемое исключение (checked exception) в Java, которое выбрасывается, когда поток (Thread) прерывается во время выполнения метода, который поддерживает прерывание (например, sleep(), wait(), join() и др.).
🚩Почему `InterruptedException` существует?
В многопоточной среде иногда требуется прервать выполнение потока, например, для завершения долгой задачи или для корректной остановки программы. Вместо грубого завершения потока (Thread.stop(), который устарел и считается небезопасным) Java предлагает мягкий способ прерывания через флаг прерывания и обработку InterruptedException.
🚩Когда выбрасывается `InterruptedException`?
Это исключение выбрасывается, если поток:
1. Ожидает (wait(), join())
2. Спит (sleep())
3. Блокируется на очереди (BlockingQueue.take(), LockSupport.park())
И при этом его прерывают с помощью метода interrupt().
Пример кода: обработка InterruptedException
class MyThread extends Thread {
public void run() {
try {
System.out.println("Поток засыпает...");
Thread.sleep(5000); // Поток засыпает на 5 секунд
} catch (InterruptedException e) {
System.out.println("Поток был прерван во время сна!");
}
System.out.println("Поток продолжает работу...");
}
}
public class Main {
public static void main(String[] args) {
MyThread t = new MyThread();
t.start();
try {
Thread.sleep(2000); // Даем потоку 2 секунды поработать
} catch (InterruptedException e) {
e.printStackTrace();
}
t.interrupt(); // Прерываем поток
}
}
Вывод программы
Поток засыпает... Поток был прерван во время сна! Поток продолжает работу...🚩Что делать после `InterruptedException`? 1. Просто обработать исключение (как в примере выше). 2. Передать исключение дальше — например, если метод не может корректно обработать прерывание, он передает его вызывающему коду:
void myMethod() throws InterruptedException {
Thread.sleep(1000); // Может выбросить исключение
}
🟠Восстановить флаг прерывания
если прерывание важно для логики программы:
catch (InterruptedException e) {
Thread.currentThread().interrupt(); // Восстанавливаем флаг прерывания
}
Ставь 👍 и забирай 📚 Базу знанийtry {
connection.setAutoCommit(false); // Отключаем автокоммит
withdraw(accountA, 1000);
deposit(accountB, 1000);
connection.commit(); // Подтверждаем транзакцию
} catch (Exception e) {
connection.rollback(); // Откат в случае ошибки
}
🚩Согласованность (Consistency) — "данные остаются корректными"
После транзакции данные должны оставаться в логически правильном состоянии.
🚩Изолированность (Isolation) — "отдельно от других транзакций"
Одна транзакция не должна мешать выполнению другой.
Два клиента одновременно бронируют одно и то же место в самолёте.
Система должна обработать их по очереди, а не одновременно.
В Java изолированность регулируется уровнями транзакций (TRANSACTION_READ_COMMITTED, TRANSACTION_REPEATABLE_READ и т. д.), чтобы избежать проблем, таких как "грязное чтение" или "фантомные записи".
connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
🚩Долговечность (Durability) — "данные не теряются"
После успешного завершения транзакции данные не должны теряться даже при сбоях (например, отключении электричества).
Ставь 👍 и забирай 📚 Базу знаний
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
