Java for Beginner
745 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
Вопрос с собеседований

Что такое livelock?🤓

Ответ:

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

Это похоже на танец: два потока уступают друг другу, но никто не продвигается.

Решение — алгоритмическая корректировка.



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


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

Джон Кеннет Оустерхаут (родился 15 октября 1954 года) — американский учёный-программист, известен как создатель языка Tcl и инструментов Tk, разработчик лог-структурированной файловой системы и системы автоматизированного проектирования VLSI (Magic).

Джилл, Леди Хоар (родилась 15 октября 1933 года) — британский программист, одна из разработчиц первого компилятора для языка ALGOL-60.


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

1973 — выпущена четвёртая редакция операционной системы UNIX.

1997Энди Грин установил новый рекорд скорости для наземного управляемого транспортного средства, развив скорость 1227,986 км/ч на автомобиле Thrust SSC.

1998 начало работы почтового сервиса Почта Mail.ru.

2007 компания «Intel» заявила о разработке нового процессора для мобильных применений — Intel Atom.


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

Глава 3. Set — множества

Практика: В «Библиотеке» создать коллекцию Set для хранения уникальных имён авторов.
Добавлять автора при добавлении книги, проверять уникальность
.

Откройте проект «Библиотека»: Запустите IntelliJ IDEA и откройте существующий проект LibraryProject (или как вы его назвали). Убедитесь, что класс Book существует с полями title, author, year, конструктором и методом printDetails() (или аналогичным для вывода).

Импортируйте необходимые пакеты: В файлах, где будете использовать Set, убедитесь, что импортированы java.util.Set и java.util.HashSet (или другая реализация). IDE подскажет, когда вы начнете писать код — используйте Ctrl+Enter для автодобавления импорта.


Выберите реализацию Set: Для этого урока используйте HashSet — это базовая реализация для уникальности без порядка. Если хотите поэкспериментировать, попробуйте LinkedHashSet для сохранения порядка вставки авторов.


Обновление класса Book (если нужно)

Класс Book уже имеет поле author типа String. Если вы не добавили геттер для author, сделайте это сейчас — он понадобится для получения имени автора при добавлении в Set.

Добавьте геттер для author:
Откройте файл Book.java.
Добавьте публичный метод getAuthor(), который возвращает значение поля author.
Это обеспечит инкапсуляцию: внешний код не будет напрямую обращаться к полю.



Создание и интеграция Set для авторов

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

Создайте класс Library (если его нет):
В пакете проекта (или в src) щелкните правой кнопкой → New → Java Class.
Назовите класс "Library".
Этот класс будет управлять списком книг и множеством авторов.

Добавьте поле для Set:
В классе Library объявите приватное поле authors типа Set, инициализированное как new HashSet<> (или LinkedHashSet<> для порядка).
Используйте private для инкапсуляции — множество не должно быть доступно напрямую извне.


Добавьте поле для списка книг:
Если вы использовали массив Book[], перенесите его в класс Library как приватное поле (Book[] books = new Book[10]; или аналогично).
Добавьте переменную для отслеживания текущего количества книг (int bookCount = 0;), чтобы управлять заполнением массива.


Создайте метод для добавления книги:
Добавьте публичный метод addBook(Book book), который:
Проверяет, есть ли место в массиве (если bookCount < books.length).
Добавляет книгу в массив (books[bookCount] = book; bookCount++;).
Получает имя автора из книги (через getAuthor()).
Добавляет имя автора в Set authors (authors.add(authorName);).
Проверяет возвращаемое значение add(): Если true, значит автор новый; если false — автор уже существует (можно вывести сообщение, например, "Автор уже добавлен").


Добавьте метод для вывода уникальных авторов:

Создайте публичный метод printAuthors(), который перебирает Set authors (через for-each цикл) и выводит каждое имя на экран с помощью System.out.println.

Обновите класс Main для тестирования:
Откройте файл Main.java.
Создайте объект Library (Library library = new Library();).
Создайте несколько объектов Book с разными авторами (некоторые с повторяющимися, чтобы проверить уникальность).
Вызовите addBook для каждой книги.
Вызовите printAuthors() — вы должны увидеть уникальный список авторов без дубликатов.
Для проверки: Добавьте книгу с существующим автором и посмотрите, добавится ли он в Set (метод add вернет false).



#Java #для_новичков #beginner #Collections #Set
👍2
Тестирование и отладка

После реализации протестируйте, чтобы убедиться в правильной работе уникальности.

Запустите проект:
Правой кнопкой на Main.java → Run 'Main.main()'.
В консоли увидите вывод уникальных авторов. Убедитесь, что дубликаты авторов не появляются в списке.


Проверьте уникальность:
Добавьте две книги с одним автором — в Set должно быть только одно имя.
Попробуйте добавить null как автора (если поле author позволяет) — проверьте поведение Set (HashSet позволит один null).


Отладка:

Установите breakpoint в методе addBook перед authors.add() и после — шагайте (F8) и смотрите, меняется ли размер Set.
Если ошибки: NullPointerException (если Set не инициализировано), ArrayIndexOutOfBoundsException (если массив переполнен) — добавьте проверку на размер.
В консоли выводите сообщения, например, если add вернул false: "Автор [name] уже существует".


Эксперименты:
Измените реализацию Set на LinkedHashSet — проверьте, сохраняется ли порядок добавления авторов.
Попробуйте TreeSet — добавьте Comparator, если нужно сортировать авторов по алфавиту (TreeSet требует Comparable для элементов).



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

Инициализация Set: Всегда инициализируйте в конструкторе класса (authors = new HashSet<>();), чтобы избежать NullPointerException.
Проверка возвращаемого значения: Используйте boolean от add/remove для логики (например, уведомление о дубликате).
Custom уникальность: Если уникальность по полю (как author), убедитесь, что equals/hashCode в Book учитывают только author, если нужно (но для Set это не требуется, так как String имеет правильные методы).
Расширение проекта: Подумайте, как добавить метод для проверки, существует ли автор перед добавлением книги (используйте contains).
Производительность: Для малого количества авторов (сотни) любая реализация подойдет; для больших — HashSet fastest.



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

Задача 1: Добавьте в Library метод isAuthorUnique(String authorName), который использует contains для проверки, есть ли автор в Set.
Задача 2: В addBook перед добавлением автора проверьте с помощью contains, и если он новый, выведите сообщение "Новый автор добавлен".
Задача 3: Создайте 5-6 книг с 3-4 уникальными авторами (некоторые повторяются), добавьте их, выведите авторов и убедитесь в уникальности.


Реализуйте эти задачи самостоятельно, следуя шагам урока. Это закрепит работу с Set в контексте проекта.


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

import java.util.*;

public class Task151025 {
public static void main(String[] args) {
Set<List<Integer>> set = new HashSet<>();
List<Integer> list1 = Arrays.asList(1, 2, 3);
List<Integer> list2 = Arrays.asList(1, 2, 3);

set.add(list1);
set.add(list2);

list1.add(4);

System.out.println(set.size());
System.out.println(set.contains(list1));
System.out.println(set.contains(list2));
}
}


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

Что такое CountDownLatch?🤓

Ответ:

CountDownLatch
— это синхронизатор, который блокирует выполнение потоков до тех пор, пока счётчик не станет 0.

Потоки вызывают countDown(), уменьшая счётчик, а другие ждут через await().

Используется для ожидания завершения задач.



#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🗓 История 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