Java for Beginner
744 subscribers
719 photos
202 videos
12 files
1.17K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
🗓 История IT-технологий сегодня — 16 октября


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

Джонатан Брюс По́стел (англ. Jonathan Bruce Postel; 6 августа 1943, Алтадина, Калифорния — 16 октября 1998, Санта-Моника, Калифорния) — американский учёный в области компьютерных наук, один из основных авторов сетевых протоколов, применяемых в сети Интернет: IP, ICMP, TCP, UDP, Telnet, FTP, DNS. В общей сложности участвовал в создании около двухсот RFC.


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

Не нашел)

#Biography #Birth_Date #Events #16Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Реактивное программирование

Введение в Spring WebFlux

Spring WebFlux — это часть Spring Framework, предназначенная для создания неблокирующих, асинхронных веб-приложений. Он основан на Project Reactor и Reactive Streams API, что позволяет использовать Mono и Flux прямо в коде сервера. Это не замена Spring MVC (традиционному веб-фреймворку), а альтернатива для сценариев с высокой нагрузкой: микросервисы, реальное время, стриминг. Почему это новый подход? В традиционном веб (как Servlet с потоками на запрос) под пиковой нагрузкой сервер исчерпывает ресурсы — каждый запрос занимает поток, который висит в ожидании IO. WebFlux меняет это: использует event-loop (цикл обработки событий), где один поток обслуживает тысячи подключений, реагируя на события асинхронно. Это экономит CPU и память, делая приложения более отзывчивыми и масштабируемыми.


Почему Spring WebFlux: связь с реактивным мышлением

WebFlux воплощает принципы, которые мы разбирали: push-модель, где данные отправляются по готовности; обратное давление для контроля темпа; операторы для трансформаций. В экосистеме Spring он интегрируется с другими компонентами: Spring Boot для быстрого старта, Spring Data Reactive для баз данных (как R2DBC), Spring Security Reactive для безопасности. Ключевой выигрыш — для IO-bound задач: запросы к БД, API или файлам идут асинхронно, без блокировок. Если ваш сервис ждёт внешних ответов 90% времени, WebFlux высвобождает ресурсы, позволяя обрабатывать в 10-100 раз больше запросов на том же железе.

Чтобы начать: добавьте spring-boot-starter-webflux в зависимости (Maven/Gradle). Spring Boot автоматически настроит Reactor Netty как сервер (неблокирующий HTTP на базе Netty). Нет нужды в Tomcat — всё реактивно
.


Ключевые компоненты Spring WebFlux


WebFlux предлагает два стиля разработки: аннотированный (похож на Spring MVC) и функциональный (роутеры как в Express.js). Оба используют Mono/Flux для ответов.

- Аннотированные контроллеры: @RestController с методами, возвращающими Mono или Flux.

Пример простого GET:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

@RestController
public class HelloController {
@GetMapping("/hello")
public Mono<String> hello() {
return Mono.just("Привет из WebFlux!"); // Асинхронный ответ
}
}

Здесь метод возвращает Mono — сервер не блокируется, ответ "течёт" асинхронно. Для Flux: стриминг данных, как SSE (сервер-сент события).


- Функциональные роутеры: Для маршрутизации без контроллеров.

Пример:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;

@Configuration
public class RouterConfig {
@Bean
public RouterFunction<ServerResponse> routes() {
return RouterFunctions.route()
.GET("/hello", request -> ServerResponse.ok().bodyValue("Привет из роутера!"))
.build();
}
}

Это декларативно: опишите маршруты, обработчики возвращают ServerResponse с Mono/Flux.


- WebClient: реактивный клиент для исходящих запросов, интегрируется seamlessly.

Ещё фишки: поддержка WebSockets для bidirectional стриминга, Server-Sent Events для push-уведомлений, интеграция с Schedulers для распределения задач.


Практические советы и подводные камни

- Миграция: Начните с аннотированных контроллеров — синтаксис похож на MVC, но возвращайте Mono/Flux.
- Тестирование: WebTestClient вместо MockMvc — асинхронные тесты с StepVerifier (из Reactor).
- Камень: Блокирующий код в контроллерах (JDBC, sleep) сломает асинхронность — используйте reactive драйверы (R2DBC) и publishOn(Schedulers.boundedElastic()).
- Производительность: Под нагрузкой мониторьте с Micrometer — WebFlux даёт метрики из коробки.


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

#Java #middle #Reactor #WebFlux
👍1
Что выведет код?

public class Task161025 {
public static void main(String[] args) {
String s1 = "hello";
String s2 = new String("hello").intern();
String s3 = "he" + "llo";
String s4 = new String("hello");

System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1 == s4);
System.out.println(s2 == s4);
}
}


#Tasks
Вопрос с собеседований

Что такое Stop-The-World?🤓

Ответ:

Stop-The-World
— это пауза, во время которой JVM останавливает все потоки для выполнения сборки мусора или других операций.

Даже при многопоточности приложение «замораживается».

Современные GC (G1, ZGC, Shenandoah) минимизируют эти паузы.



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


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

Аншуков Сергей Александрович (род. 17 октября 1961 года) — системный программист, участник таких проектов, как ОС ДЕМОС, cеть Релком, «Национальная служба новостей» (НСН), Национальная электронная библиотека (НЭБ) и других. Обладатель премии Совета Министров СССР за «юниксизацию СССР».


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

1831 — Майкл Фарадей произвёл первое успешное испытание электрического динамо, открыв электромагнитную индукцию.

1985 — выпущен первый 32-разрядный процессор для IBM PC-совместимых компьютеров — Intel 80386.

1990 — основана база данных IMDb (Internet Movie Database) — крупнейшая база данных и веб-сайт о кинематографе.



#Biography #Birth_Date #Events #17Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Раздел 6. Коллекции в Java

Глава 4. Queue и Deque

Интерфейс Queue. Очередь как структура FIFO. Методы offer, poll, peek


Интерфейс Queue<E> — часть Java Collections Framework (JCF) из пакета java.util, предназначенная для хранения элементов, которые обрабатываются в определенном порядке. Queue моделирует очередь, где элементы добавляются в конец (tail) и извлекаются из начала (head). Основной принцип для большинства реализаций — FIFO, хотя есть исключения, например, приоритетные очереди.

Основные характеристики Queue:
FIFO (First-In-First-Out): Элементы обрабатываются в порядке добавления, как очередь в магазине.
Уникальность: Не гарантируется — дубликаты разрешены (зависит от реализации).
Порядок: Определен структурой (обычно порядок добавления или приоритет).
Big O: Зависит от реализации (O(1) для LinkedList, O(log n) для PriorityQueue).
Null элементы: Зависит от реализации (LinkedList позволяет, PriorityQueue — нет).


Где используется:
Очереди задач (например, обработка запросов в сервере).
Буферы (например, поток ввода-вывода).
Алгоритмы (например, обход графа в ширину — BFS).


Queue<E> расширяет Collection<E>, добавляя методы для работы с очередью.

Основные реализации:
LinkedList (как Queue), ArrayDeque и PriorityQueue.


FIFO: Принцип "первым вошел — первым вышел"

FIFO — это структура данных, где:
Элементы добавляются в конец очереди (enqueue).
Элементы извлекаются из начала (dequeue).
Аналогия: Люди в очереди в кассу — первый в очереди обслуживается первым.


Пример FIFO в жизни: Очередь сообщений в чате обрабатывается в порядке отправки.

Нюанс: PriorityQueue нарушает FIFO, сортируя по приоритету (рассмотрим в следующем уроке).


Основные методы Queue: offer, poll, peek

Queue предоставляет методы для работы с очередью, которые отличаются от add/remove Collection тем, как обрабатывают ограничения (например, заполненность).

offer(E e):

Описание: Добавляет элемент в конец очереди.
Возвращаемое значение: true, если добавлен; false, если очередь полная (для bounded очередей, например, с фиксированным размером).
Исключения: NullPointerException, если null в реализациях, не допускающих null (PriorityQueue).
Big O: O(1) для LinkedList/ArrayDeque, O(log n) для PriorityQueue (перестройка кучи).


poll():

Описание: Извлекает и удаляет элемент из начала очереди.
Возвращаемое значение: Элемент (E) или null, если очередь пуста.
Исключения: Нет (безопаснее, чем remove()).
Big O: O(1) для LinkedList/ArrayDeque, O(log n) для PriorityQueue.


peek():
Описание: Возвращает элемент из начала очереди без удаления.
Возвращаемое значение: Элемент (E) или null, если очередь пуста.
Исключения: Нет.
Big O: O(1) для всех реализаций.


Альтернативы (с исключениями):
add(E e): Как offer, но кидает IllegalStateException при переполнении.
remove(): Как poll, но кидает NoSuchElementException, если пусто.
element(): Как peek, но кидает NoSuchElementException, если пусто.
Нюанс: offer/poll/peek предпочтительнее для очередей, так как безопаснее.



#Java #для_новичков #beginner #Collections #Queue
👍1
Примеры использования методов

LinkedList как Queue (FIFO):
javaimport java.util.LinkedList;
import java.util.Queue;

public class Main {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
// Добавление
queue.offer("Задача 1");
queue.offer("Задача 2");
System.out.println(queue); // [Задача 1, Задача 2]

// Просмотр
System.out.println(queue.peek()); // Задача 1 (без удаления)
System.out.println(queue); // [Задача 1, Задача 2]

// Извлечение
String task = queue.poll(); // Задача 1
System.out.println(task); // Задача 1
System.out.println(queue); // [Задача 2]

// Пустая очередь
queue.poll(); // Задача 2
System.out.println(queue.poll()); // null (без исключения)
}
}

Вывод: Показывает FIFO — элементы извлекаются в порядке добавления, null при пустой очереди.


PriorityQueue (не FIFO, по приоритету):

javaimport java.util.PriorityQueue;
import java.util.Queue;

public class Main {
public static void main(String[] args) {
Queue<Integer> queue = new PriorityQueue<>();
queue.offer(3);
queue.offer(1);
queue.offer(2);
System.out.println(queue); // [1, 3, 2] — минимальный в начале

System.out.println(queue.peek()); // 1
System.out.println(queue.poll()); // 1
System.out.println(queue); // [2, 3]
}
}

Нюанс: PriorityQueue сортирует по натуральному порядку (или Comparator), не FIFO.



Все нюансы методов

offer:

Для bounded очередей (с ограничением размера, например, ArrayBlockingQueue) возвращает false, если полная.
Null: LinkedList позволяет, PriorityQueue — NPE.
Custom объекты: Для PriorityQueue должны быть Comparable или нужен Comparator.


poll:
Безопасно для пустой очереди — просто null.
В PriorityQueue извлекает минимальный элемент (или по Comparator).


peek:
Не меняет очередь — только просмотр.
Null при пустой очереди, безопасно.


Ошибки:
NullPointerException: В PriorityQueue при null.
ClassCastException: В PriorityQueue, если элементы не Comparable.
ConcurrentModificationException: При модификации во время итерации (используйте poll вместо Iterator.remove()).


Thread-safety:
LinkedList, PriorityQueue не thread-safe. Используйте BlockingQueue (например, ArrayBlockingQueue) для многопоточности.
Collections.synchronizedCollection() — простой вариант синхронизации.

Производительность:
LinkedList: O(1) для всех методов (двусвязный список).
PriorityQueue: O(log n) для offer/poll (перестройка кучи), O(1) для peek.
ArrayDeque: O(1) для всех (рассмотрим в следующем уроке).



Полезные советы для новичков

Используйте offer/poll/peek: Безопаснее, чем add/remove/element.
LinkedList как Queue: Универсально для FIFO, но больше памяти, чем ArrayDeque.
Custom классы в PriorityQueue: Реализуйте Comparable или передайте Comparator.
Проверка пустоты: queue.isEmpty() перед poll/peek не нужна — null безопасен.
Итерация: For-each для чтения, но не модифицируйте очередь.



#Java #для_новичков #beginner #Collections #Queue
👍2
Что выведет код?

import java.util.*;

public class Task171025 {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(1);
queue.offer(2);
queue.offer(3);

System.out.print(queue.peek() + " ");
System.out.print(queue.poll() + " ");
queue.offer(4);
System.out.print(queue.remove() + " ");
System.out.print(queue.element() + " ");
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
25%
1 1 3 4
0%
1 1 2 2
0%
1 2 3 4
75%
1 1 2 3
Вопрос с собеседований

Чем отличается JIT от AOT-компиляции?🤓

Ответ:

JIT
компилирует байт-код в машинный во время выполнения.

AOT (Ahead-Of-Time) компилирует код заранее, до запуска (например, GraalVM native image).

JIT даёт гибкие оптимизации, AOT — более быстрое время старта и меньше зависимость от JVM.



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


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

Нир Шавит (англ. Nir Shavit, ивр. ‏ ניר שביט‌‌‎, род. 18 октября 1959) — израильский учёный в области информатики. Профессор факультета информатики в Тель-Авивском университете и профессор электротехники и информатики в Массачусетском технологическом институте.

Сантош Вемпала (родился 18 октября 1971 года) — выдающийся теоретик информатики, специалист по алгоритмам и случайным методам в оптимизации и геометрии; профессор Georgia Tech с большим числом влиятельных работ по алгоритмике.


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

1963 — первый в истории полёт кошки (Фелисетт) в космическое пространство.

1967 — советский космический аппарат «Венера-4» успешно вошёл в атмосферу Венеры и начал её изучение.



#Biography #Birth_Date #Events #18Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2