Java for Beginner
870 subscribers
1.01K photos
275 videos
14 files
1.69K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Практические улучшения

На практике QuickSort модифицируют для избежания худшего случая:
Рандомизированный выбор опорного элемента
Выбор медианы трех элементов
При маленьких размерах подмассивов переход на сортировку вставками

public class OptimizedQuickSort {
private static final int INSERTION_THRESHOLD = 16;

public static void sort(int[] array) {
randomizedQuickSort(array, 0, array.length - 1);
}

private static void randomizedQuickSort(int[] array, int low, int high) {
// Для маленьких массивов используем сортировку вставками
if (high - low < INSERTION_THRESHOLD) {
insertionSort(array, low, high);
return;
}

// Рандомизированный выбор опорного элемента
int randomIndex = low + (int)(Math.random() * (high - low + 1));
swap(array, randomIndex, high);

int pivotIndex = partition(array, low, high);
randomizedQuickSort(array, low, pivotIndex - 1);
randomizedQuickSort(array, pivotIndex + 1, high);
}
}



Практическое значение асимптотического анализа

Понимание асимптотической сложности позволяет делать осознанный выбор алгоритмов:

Для небольших фиксированных n простой алгоритм O(n²) может быть лучше сложного O(n log n) из-за меньших констант
При обработке потоковых данных важна сложность по памяти, а не только по времени
В системах реального времени критичны гарантии худшего случая, а не среднего

Распространенные заблуждения

Миф: "O(100n) хуже чем O(n²)"
Реальность: O(100n) = O(n) — константы отбрасываются

Миф: "Big O описывает точное время выполнения"
Реальность: Big O описывает скорость роста, а не конкретные временные значения

Миф: "Алгоритм O(log n) всегда быстрее O(n)"
Реальность: При малых n константные факторы могут сделать O(n) быстрее


#Java #для_новичков #beginner #algorithm #bigO
👍4
Что выведет код?

public class Task090126 {
public static void main(String[] args) {
int n = 10;
int count = 0;
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j += i) {
count++;
}
}
System.out.println(count);
}
}


#Tasks
👍3
Варианты ответа:
Anonymous Quiz
19%
10
38%
27
33%
53
10%
127
👍3
Почему Stream нельзя переиспользовать? 🤓

Ответ:

Stream — одноразовый конвейер. После terminal-операции он считается закрытым.

Это сделано для предотвращения побочных эффектов и обеспечения ленивых вычислений.

Повторное использование нарушило бы контракт исполнения.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍2
История IT-технологий сегодня — 10 января


ℹ️ Кто родился в этот день

Дональд Эрвин Кнут (англ. Donald Ervin Knuth, МФА: /kəˈnuːθ/ Шаблон:Respel; род. 10 января 1938 года, Милуоки, штат Висконсин)американский учёный в области информатики, доктор философии (1963), эмерит-профессор Стэнфордского университета, член Американского философского общества (2012), преподаватель и идеолог программирования, автор 19 монографий (в том числе ряда классических книг по программированию) и более 160 статей, разработчик нескольких известных программных технологий. Является автором всемирно известной серии книг, посвящённой основным алгоритмам и методам вычислительной математики, а также создателем настольных издательских систем TeX и METAFONT, предназначенных для набора и вёрстки книг научно-технической тематики (в первую очередь — физико-математических).


🌐 Знаковые события

2001 — первый выход в свет Wikipedia как части «Нупедии». Через 5 дней Wikipedia становится самостоятельным сайтом.


#Biography #Birth_Date #Events #10Января
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
С 27.12 по 09.01
Предыдущий пост(с 20.12 по 26.12)

Воскресный мотивационный пост:
Вот и пришёл 2026 год 🎄

Запись встреч/видео:
Tree в Java. Самая сложная коллекция.

OrderHub. Эволюция проекта из монолита к production-ready микросервису
1. Старт серии. Создаём основу для production-системы

Обучающие статьи:
Java:
Глава 8. Дополнительные аспекты коллекций
Потокобезопасные коллекции и типичные ошибки
Практика

Раздел 7. Алгоритмы

Глава 1: Основы анализа алгоритмов
Временная сложность и Big O нотация: язык анализа алгоритмов

Глубокая архитектура и внутреннее устройство RabbitMQ
AMQP 1.0 vs AMQP 0-9-1: эволюция протокола
Введение: Современный стек для production
Паттерны использования и гарантии доставки в RabbitMQ

Полезные статьи и видео:
ПОДКЛЮЧЕНИЕ GPT GO на ГОД!

Моя первая статья на хабре
Field vs Constructor Injection в Java: ошибка объектного дизайна или вопрос синтаксиса?

Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
🔥2
Всем привет! 👌

А давайте завтра встретимся? И запишем видео как написать своего AI бота в телеге? ☺️

В нагрузку покажу основные фишки нового обновления Telegram API v9.3. 👏

Кто придет? 🤨
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1
История IT-технологий сегодня — 11 января


ℹ️ Кто родился в этот день

Мэтью «Мэтт» Чарльз Мулленвег (англ. Matthew Charles "Matt" Mullenweg; 11 января 1984 года, Хьюстон, Техас, США) — американский программист, предприниматель, менеджер и музыкант; создатель и основной разработчик распространяемой по лицензии GNU GPL системы управления содержимым сайта с открытым исходным кодом WordPress; основатель, владелец и руководитель девелоперской компании Automattic и некоммерческой организации WordPress Foundation, поддерживающей инфраструктуру WordPress; член совета директоров некоммерческого издания Grist; поддерживает ряд филантропических организаций, в частности Архив Интернета, Electronic Frontier Foundation, Фонд свободного программного обеспечения, Long Now Foundation и Innocence Project; участник и докладчик множества международных конференций.


🌐 Знаковые события

1700 — в России вместо византийского календаря введён юлианский календарь. После 31 декабря 7208 года наступило 1 января 1700 года. Начало года перенесёно на 1 января.

1787 — Уильям Гершель открыл Титанию и Оберон — спутники планеты Уран.

2011 — Прекращена общая поддержка операционной системы Windows XP Service Pack 3.

2022 — прекращена основная поддержка Windows Server 2016.



#Biography #Birth_Date #Events #11Января
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Напоминаю, что сегодня в 16:00 по МСК встречаемся в Яндекс.Телемост))


Приходите, жду всех!
👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Telegram AI Bot. Версия Telegram API 9.3+

В этом видео мы разбираем реальное обновление Telegram Bot API, которое наконец делает стриминг ответов в Telegram нативным, без костылей и бесконечных EditMessageText.

Бота пишем самого простого, просто в целях демонстрации, не более.

Сама демонстрация работы в самом конце)

Показываю и объясняю на живом Java-проекте:
🔹Long Polling (без webhook и ngrok)
🔹Spring Boot + Spring AI
🔹Потоковые ответы от LLM
🔹Новый механизм sendMessageDraft
🔹Автоматическую работу по замене названий в forum topics

⚠️ sendMessageDraft работает только в темах форума
⚠️ В Java SDK метод sendMessageDraft ещё не реализован — показываю, как добавить вручную

Исходный код проекта на GitHub очень ждет Ваших звезд.

Ссылка на Youtube
Ссылка на Рутьюб

Смотрите, ставьте лайки, подписывайтесь на каналы!✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥31
История IT-технологий сегодня — 12 января


ℹ️ Кто родился в этот день

Серге́й Па́влович Королёв (30 декабря 1906 [12 января 1907], Житомир, Волынская губерния, Российская империя — 14 января 1966, Москва, СССР)советский учёный, конструктор ракетно-космических систем. Дважды Герой Социалистического Труда. Академик АН СССР (1958). Член-корреспондент Академии артиллерийских наук. Председатель Совета главных конструкторов СССР (1946—1966). Лауреат Ленинской премии. Инженер-полковник.

Дже́ффри Престон Бе́зос (англ. Jeffrey Preston Bezos, фамилия при рождении — Йо́ргенсен (англ. Jorgensen); род. 12 января 1964, Альбукерке, Берналийо, Нью-Мексико, США) американский предприниматель, основатель интернет-компании Amazon, создатель и владелец аэрокосмической компании Blue Origin, владелец издательского дома The Washington Post.


🌐 Знаковые события

2021 — остановлена работа плагина Flash Player.


#Biography #Birth_Date #Events #12Января
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Обработка ошибок и мониторинг RabbitMQ

В современных системах мониторинг — это не просто сбор метрик, а целостная система наблюдаемости, состоящая из трёх столпов: метрики, логи и трассировка. RabbitMQ, как критический компонент инфраструктуры, требует особого внимания ко всем трём аспектам.


Мониторинг: многоуровневый подход

RabbitMQ Management UI: первый рубеж защиты

Management UI — это визуальный интерфейс, но его настоящая ценность в оперативном обнаружении аномалий.

Критические метрики в реальном времени:
Message rates — скорость публикации и потребления сообщений
Queue depths — глубина очередей (backlog)
Consumer count — количество активных потребителей
Connection churn — частота переподключений

Паттерны для наблюдения:
Внезапный рост глубины очереди указывает на отставание потребителей
Падение количества потребителей сигнализирует о проблемах с deployment
Увеличение частоты переподключений говорит о сетевых проблемах

Prometheus метрики: систематический мониторинг

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

Базовые метрики для любого кластера:
rabbitmq_queue_messages_ready        # Сообщения, готовые к доставке
rabbitmq_queue_messages_unacked # Сообщения в процессе обработки
rabbitmq_queue_consumers # Количество потребителей
rabbitmq_process_open_fds # Открытые файловые дескрипторы
rabbitmq_erlang_gc_reclaimed_bytes # Память, освобождённая сборщиком мусора


Производственные алерты должны отслеживать:
Глубину очереди, превышающую разумные лимиты
Отсутствие потребителей для критических очередей
Необычные паттерны в скорости обработки сообщений
Потребление памяти, приближающееся к лимитам


Health Checks в Spring Boot Actuator: проверка жизнеспособности

Spring Boot Actuator предоставляет готовые health checks, но в production их нужно расширять:

Три уровня проверок:
Liveness — проверка, что приложение запущено
Readiness — проверка готовности принимать трафик
Startup — мониторинг процесса запуска

Кастомные health checks для RabbitMQ:
// Концептуальный пример расширенной проверки
@Component
public class RabbitMQBusinessHealthIndicator {

public Health checkBusinessReadiness() {
// Проверяем не только соединение, но и:
// 1. Наличие критических очередей
// 2. Наличие активных потребителей
// 3. Разумную глубину очередей
// 4. Скорость обработки сообщений
}
}

Важный принцип: Health checks должны проверять не только доступность RabbitMQ, но и способность вашего приложения эффективно с ним взаимодействовать.



Стратегии обработки ошибок

Классификация ошибок: знай своего врага

Транзиентные ошибки (временные):
Сетевые проблемы
Временная недоступность сервиса
Кратковременные таймауты

Бизнес-ошибки:
Невалидные данные в сообщении
Нарушение бизнес-правил
Конфликты данных

Системные ошибки:
Потеря соединения с базой данных
Недостаток ресурсов
Баги в коде


Retry с экспоненциальной задержкой

Повторные попытки — стандартный подход для транзиентных ошибок, но важно избегать retry storms:

Принципы правильного retry:
Экспоненциальная задержка между попытками
Ограничение максимального количества попыток
Исключение бизнес-ошибок из retry логики
Использование jitter для распределения нагрузки

# Конфигурация Spring Retry
spring:
rabbitmq:
listener:
simple:
retry:
enabled: true
max-attempts: 3
initial-interval: 1s
multiplier: 2
max-interval: 10s



Circuit Breaker: защита от каскадных отказов

Автоматический выключатель предотвращает зацикливание вызовов при постоянных ошибках:

Три состояния Circuit Breaker:
Closed — запросы проходят нормально
Open — запросы сразу отклоняются
Half-Open — пробные запросы для проверки восстановления

Использование с RabbitMQ: Circuit breaker следует применять для операций, которые могут вызывать каскадные отказы, например, при вызове внешних сервисов из обработчиков сообщений.

#Java #middle #RabbitMQ
👍2
Dead Letter Queues: изоляция проблемных сообщений

DLQ — это не мусорка, а система диагностики:

Что отправлять в DLQ:
Сообщения, превысившие лимит попыток обработки
Сообщения с истёкшим TTL
Сообщения, отброшенные из-за переполнения очереди

Архитектура обработки DLQ:
Анализ — изучение причин попадания в DLQ
Классификация — разделение на исправимые и неисправимые ошибки
Восстановление — повторная обработка после исправления
Архивация — сохранение неисправимых сообщений для анализа


Логирование и трассировка

Correlation IDs: сквозная идентификация запросов

Correlation ID — это уникальный идентификатор, который проходит через все компоненты системы, участвующие в обработке запроса.

Реализация в Spring Boot:
// Фильтр для HTTP запросов
@Component
public class CorrelationIdFilter implements Filter {

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) {
// Извлекаем или генерируем correlation ID
// Помещаем в MDC для логирования
// Добавляем в заголовки RabbitMQ сообщений
}
}

// MessagePostProcessor для RabbitMQ
@Component
public class CorrelationIdMessagePostProcessor implements MessagePostProcessor {

public Message postProcessMessage(Message message) {
// Добавляем correlation ID из MDC в заголовки сообщения
return message;
}
}

Важно: Correlation ID должен передаваться через все асинхронные границы — HTTP запросы, сообщения RabbitMQ, вызовы внешних API.



Структурированное логирование: от текста к данным

Структурированные логи (JSON, Logstash) позволяют автоматически анализировать и агрегировать данные.

Ключевые поля для каждого log entry:
timestamp
level
logger
message
correlationId
traceId/spanId (для трассировки)
Дополнительный контекст (queue, messageId, userId)

Конфигурация Logback для JSON:
<appender name="JSON" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"application":"${APP_NAME}"}</customFields>
</encoder>
</appender>


Паттерны логирования для RabbitMQ:
При публикации сообщения: логируем messageId, routingKey, размер сообщения
При получении сообщения: логируем deliveryTag, очередь, consumer
При обработке: логируем длительность, результат, ошибки
При подтверждении: логируем успешность, время обработки


Распределённая трассировка с OpenTelemetry

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

Интеграция RabbitMQ с OpenTelemetry:
Инъекция trace context в заголовки сообщений
Создание spans для операций публикации и потребления
Связывание spans через очередь сообщений

Концептуальный подход:
HTTP Request → [Span A] → RabbitMQ Publish → [Span B]

(сообщение в очереди)

RabbitMQ Consume → [Span C] → DB Call → [Span D]

Важно: Даже при асинхронной коммуникации через RabbitMQ можно сохранить контекст трассировки, передавая traceId и spanId в заголовках сообщений.



Практические рекомендации

Уровни мониторинга

Инфраструктурный уровень: доступность RabbitMQ, использование ресурсов
Уровень приложения: health checks, метрики Spring Boot
Бизнес-уровень: скорость обработки заказов, количество ошибок

Стратегия алертинга

Приоритеты алертов:
P0: Полная недоступность RabbitMQ или критичных очередей
P1: Быстрый рост глубины очереди (> 1000 сообщений/минуту)
P2: Отсутствие потребителей для критичных очередей
P3: Ухудшение производительности (> 95 перцентиль latency)

Паттерны для production

Всегда используйте Publisher Confirms для гарантированной доставки
Реализуйте идемпотентность на стороне потребителя
Настройте разумные TTL для сообщений
Мониторьте не только RabbitMQ, но и своё приложение
Тестируйте сценарии отказа в staging среде


#Java #middle #RabbitMQ
👍2
Что выведет код?

public class Task120126 {
public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
int e = 128;

System.out.println(a == b);
System.out.println(c == d);
System.out.println(c == e);
System.out.println(c.equals(e));
}
}


#Tasks
👍1
Хотел уточнить - на последнем виде про бота нет ни одного лайка... Все так плохо? Может удалить это видео?
Anonymous Poll
4%
Да, все плохо. Лучше удали
67%
Не смотрел...
30%
Вроде все хорошо, щас поставлю лайк)))
👍1
Почему лямбды не всегда лучше обычных методов? 🤓

Ответ:

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

Их используют для простых операций, а не как замену полноценным методам.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
История IT-технологий сегодня — 13 января


ℹ️ Кто родился в этот день

Никого не нашел, поэтому вот:

Ракеш Ша́рма (хинди राकेश शर्मा; род. 13 января 1949, Патиала, Пенджаб, Индия) — первый индийский космонавт и 138-й человек в мире, совершивший полёт в космос. Герой Советского Союза (1984).


🌐 Знаковые события

Не нашел(


#Biography #Birth_Date #Events #13Января
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
Раздел 7. Алгоритмы

Глава 1: Основы анализа алгоритмов

Пространственная сложность и компромиссы

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

Пространственная сложность измеряется в тех же асимптотических обозначениях (Big O, Ω, Θ), что и временная, но фокусируется на потреблении памяти. Она включает три основные составляющие:

Входные данные: обязательная память

Любой алгоритм должен хранить входные данные, над которыми он работает. В асимптотическом анализе память под входные данные обычно считается необходимой и включается в общую оценку.
public class InputMemoryExample {
// Метод суммирует элементы массива
// Память: O(n) для хранения входного массива
public static int sumArray(int[] array) {
int sum = 0;
for (int value : array) {
sum += value;
}
return sum;
}

// Метод создает копию массива
// Память: O(n) для входных данных + O(n) для копии = O(n)
public static int[] copyAndModify(int[] array) {
int[] copy = new int[array.length]; // Дополнительная память O(n)
for (int i = 0; i < array.length; i++) {
copy[i] = array[i] * 2;
}
return copy;
}
}


Для алгоритмов, которые модифицируют входные данные in-place (на месте), дополнительная память может быть минимальной. Однако часто такие алгоритмы требуют, чтобы входные данные можно было изменять, что не всегда допустимо в реальных системах.


Вспомогательные структуры данных

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

public class AuxiliaryStructures {
// Алгоритм поиска двух чисел с заданной суммой
// Версия 1: Без дополнительной памяти, но O(n²) времени
public static int[] findPairNaive(int[] array, int targetSum) {
for (int i = 0; i < array.length; i++) {
for (int j = i + 1; j < array.length; j++) {
if (array[i] + array[j] == targetSum) {
return new int[]{array[i], array[j]};
}
}
}
return null; // Память: O(1) вспомогательной
}

// Версия 2: С хеш-таблицей, O(n) времени, но O(n) памяти
public static int[] findPairOptimized(int[] array, int targetSum) {
Set<Integer> seen = new HashSet<>(); // Вспомогательная структура O(n)
for (int num : array) {
int complement = targetSum - num;
if (seen.contains(complement)) {
return new int[]{complement, num};
}
seen.add(num);
}
return null;
}
}


Выбор между этими подходами демонстрирует классический компромисс время-память. Первый алгоритм экономит память, но работает медленно на больших данных. Второй алгоритм требует дополнительной памяти пропорционально размеру входных данных, но обеспечивает линейное время выполнения.


#Java #для_новичков #beginner #algorithm #bigO
👍2