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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Примеры использования методов

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
👍3
Что выведет код?

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
👍1
Варианты ответа:
Anonymous Quiz
18%
1 1 3 4
9%
1 1 2 2
18%
1 2 3 4
55%
1 1 2 3
👍2
Вопрос с собеседований

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

Ответ:

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

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

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



#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
История 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
👍3
История IT-технологий сегодня — 19 октября


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

Джеймс Уэлдон Деммел-младший (родился 19 октября 1955 года) американский математик и информатик, ведущий специалист по численным методам и линейной алгебре для высокопроизводительных вычислений; автор фундаментальных результатов и библиотек для линейной алгебры.


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

2002 — восьмая решающая партия между россиянином Владимиром Крамником и компьютерной программой «Deep Fritz», проходившая в Манаме, Бахрейн, на 21 ходу завершилась вничью. Таким образом, ничьей завершился и сам матч.

2011 — Александр Йи и Сигэру Кондо рассчитали значение числа «Пи» с точностью в 10 трлн цифр после запятой.



#Biography #Birth_Date #Events #19Октября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Вам нравятся мотивационные статьи по воскресениям?
Anonymous Poll
60%
Да! Конечно) Жду каждое воскресение
20%
Нет, не интересно)
20%
Что за статьи?
🔥6
История IT-технологий сегодня — 20 октября


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

Серге́й Алексе́евич Ле́бедев (20 октября [2 ноября] 1902, Нижний Новгород, Российская империя — 3 июля 1974, Москва, СССР) советский учёный, один из основоположников отечественной вычислительной техники; организатор и руководитель разработок первых советских ЭВМ, директор ИТМиВТ АН СССР.

Артур Уитни (родился 20 октября 1957 года) разработчик языков программирования (A+, k, q), влиятелен в области языков для обработки массивных данных и высокопроизводительной финансовой аналитики.


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

1997 — компания Microsoft обвинена в нарушении антитрастового законодательства США.

1998 — открыт информационный интернет-сервер «Кирилл и Мефодий».



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

Простой REST-контроллер с Mono и Flux в Spring WebFlux

Spring WebFlux работает на Spring Boot — это упрощает запуск.


Создайте новый проект в IDE (IntelliJ, Eclipse) или через spring.io/initializr с зависимостями:
- Spring Reactive Web (для WebFlux).
- Spring Boot Starter WebFlux.


В pom.xml (Maven) это выглядит так:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

Для Gradle: implementation 'org.springframework.boot:spring-boot-starter-webflux'


Запустите приложение с @SpringBootApplication в главном классе. По умолчанию сервер — Reactor Netty (неблокирующий HTTP-сервер), порт 8080. Нет нужды в Tomcat — всё асинхронно. Если у вас уже есть Spring MVC, исключите starter-web, чтобы избежать конфликтов.

Теперь к контроллерам: в WebFlux они аннотированы @RestController (как в MVC), но методы возвращают Mono или Flux. Это значит: контроллер не блокирует поток — он возвращает "реактивный объект", а фреймворк сам подпишется и отправит ответ по мере готовности. Это решает боли блокировок: пока данные готовятся (например, запрос в БД), поток свободен для других запросов.


Mono в контроллере: для одиночных ответов

Mono — это поток для нуля или одного элемента, идеален для типичных REST-операций: GET одного ресурса, POST с созданием, DELETE с подтверждением. В контроллере метод возвращает Mono<T>, где T — ваш DTO или простая строка. Фреймворк автоматически сериализует его в JSON (с Jackson) и отправляет, когда элемент готов.

Простой пример: контроллер для приветствия.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

@RestController
public class GreetingController {

@GetMapping("/greet/{name}")
public Mono<String> greet(@PathVariable String name) {
return Mono.just("Привет, " + name + "! Добро пожаловать в реактивный мир.");
}
}

Здесь @GetMapping — аннотация для маршрута, @PathVariable — параметр из URL. Метод возвращает Mono.just — простой синхронный элемент. Но под капотом: WebFlux подпишется на Mono, и когда значение готово (сразу), отправит HTTP 200 с телом. Если бы внутри был асинхронный вызов (например, Mono.delay(Duration.ofSeconds(2)).map(ignore -> "Задержанный привет")), сервер не заблокируется — запрос обработается асинхронно.


Почему Mono лучше Object в MVC? В MVC метод ждёт выполнения (блокирует поток), здесь — нет. Под нагрузкой: тысячи /greet запросов — WebFlux использует event-loop (один поток на все), Reactor распределяет через Schedulers.

Если внутри Mono — запрос к сервису:
@Service
public class UserService {
public Mono<User> findUserById(Long id) {
return Mono.fromCallable(() -> /* симуляция БД */ new User(id, "Имя")); // Асинхронно
}
}


В контроллере:
@GetMapping("/user/{id}")
public Mono<User> getUser(@PathVariable Long id) {
return userService.findUserById(id);
}


Это цепочка: контроллер возвращает Mono от сервиса, фреймворк ждёт готовности без блокировки. Если ошибка в сервисе — onError преобразуется в HTTP 500, но вы можете настроить с @ExceptionHandler.

Расширим: обработка параметров запроса (@RequestParam) и тела (@RequestBody).

Для POST:
@PostMapping("/create-user")
public Mono<User> createUser(@RequestBody Mono<UserRequest> requestMono) {
return requestMono.flatMap(req -> {
// Асинхронная логика: создать пользователя
return userService.createUser(req.getName()).map(saved -> new User(saved.getId(), saved.getName()));
});
}

Здесь @RequestBody — Mono, потому что тело может приходить асинхронно (большие данные). flatMap — для цепочки (из поста 8), чтобы "развернуть" подпоток.



#Java #middle #Reactor #WebFlux #Mono #Flux
👍2