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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
👍4🤯2
Создал канал в сетке!

Присоединяйтесь! 🙂

https://set.ki/channel/35sLVoe
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Вопрос с собеседований

Что такое virtual threads в Java? 🤓

Ответ:

Virtual threads (введены в Java 21)
— легковесные потоки, управляемые JVM, а не ОС. Они дешевы в создании и позволяют масштабировать приложения с тысячами потоков.

Пример:
Thread vt = Thread.ofVirtual().start(() -> System.out.println("Virtual thread"));

В отличие от платформенных потоков, виртуальные не привязаны к OS-thread, снижая overhead. Полезны для I/O-bound задач.


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


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

Вале́рий Никола́евич Реше́тников (16 сентября 1943 — 30 ноября 2020) — российский учёный, доктор физ.-мат. наук, руководил Центром визуализации и спутниковых информационных технологий в НИИ системных исследований РАН; внёс вклад в прикладные ИТ-решения для дистанционного зондирования и визуализации больших данных.

Сьюзен Лоис Грэм (родилась 16 сентября 1942 года) — американский учёный в компьютерных науках, профессор UC Berkeley; известна работами по компиляторам, инструментальным средствам разработки и программным системам для масштабируемого программирования.


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

1959 — В США представлен публике первый коммерческий копировальный аппарат Xerox 914.


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

Вступление

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


Представьте: сервер обрабатывает тысячи подключений, но каждый запрос занимает отдельный поток, который висит в ожидании, пока не придёт ответ от сети или диска. Это как пытаться пропустить толпу через узкий коридор — пробки неизбежны.

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


Асинхронщина и её проблемы: от основ к пределам

Что такое асинхронность в программировании?
Это когда программа не стоит на месте, ожидая завершения одной задачи, а продолжает работать с другими. В Java это реализуется через механизмы, позволяющие запускать код параллельно. Но на пути к идеалу было много подводных камней.



Потоки: базовый, но тяжёлый инструмент

Многопоточность в Java появилась ещё в ранних версиях языка. Идея проста: вы создаёте новый поток — это как отдельный "рабочий", который выполняет код независимо от основного.


Код выглядит так:
new Thread(() -> { /* ваш код */ }).start();. 


Внутри метода run() вы пишете, что нужно сделать. На первый взгляд, это решает проблему: пока один поток ждёт ответа от сервера, другой может обрабатывать новый запрос.

Но практика показывает минусы. Каждый поток — это тяжёлый объект: он требует выделения памяти (обычно от 1 МБ на стек), системных ресурсов операционной системы и времени на создание. Если нагрузка растёт — скажем, 10 тысяч одновременных запросов, — вы не сможете создать 10 тысяч потоков: система просто исчерпает ресурсы, и всё упадёт. Ещё одна боль — контекстные переключения: когда процессор переключается между потоками, это стоит CPU-времени, иногда до микросекунд на переключение, что накапливается в большие задержки.

Чтобы смягчить это, в Java ввели ExecutorService — сервис-исполнитель, который управляет пулом потоков. Вы создаёте фиксированный пул, например, Executors.newFixedThreadPool(10), и подаёте задачи:
executor.execute(() -> { /* код */ });


Теперь потоки переиспользуются: закончил задачу — берёт следующую. Это экономит ресурсы, но не решает корень проблемы. Если в задаче есть блокирующий код — например, чтение из файла или ожидание сети, — поток всё равно "зависает" в ожидании, блокируя место в пуле. Другие задачи ждут в очереди, и под высокой нагрузкой пул исчерпывается. В итоге, асинхронность есть, но она неэффективна: ресурсы тратятся на ожидание, а не на полезную работу.



#Java #middle #Reactor
👍3
Future: обещание результата, но с подвохом

В Java 5 ввели Future — это как "чек" на будущий результат.
Вы подаёте задачу в executor и получаете объект Future, который обещает: "когда-нибудь я дам тебе ответ".


Пример:
ExecutorService executor = Executors.newFixedThreadPool(10); Future<String> future = executor.submit(() -> { Thread.sleep(1000); return "Привет"; });.


Плюс в том, что вы можете продолжать работу, не дожидаясь: пока задача крутится в фоне, основной код идёт дальше. Но чтобы забрать результат, нужно вызвать future.get(). И вот здесь засада: get() блокирует текущий поток до тех пор, пока задача не завершится. Если задача задерживается — скажем, из-за сети, — ваш поток тоже висит в ожидании. Получается, асинхронность иллюзорна: да, запуск асинхронный, но использование результата синхронное и блокирующее. Это как заказать еду по доставке, но стоять у двери, не отходя, пока курьер не приедет. Выигрыш минимален, особенно в веб-приложениях, где запросы должны обрабатываться быстро.


Ещё Future неудобен в композиции: если нужно объединить результаты нескольких задач, приходится вручную ждать каждого get(), что приводит к спагетти-коду с try-catch для ошибок и таймаутами.


CompletableFuture: цепочки действий, но без избавления от ада

Java 8 принесла CompletableFuture — улучшенную версию Future, которая позволяет строить цепочки асинхронных операций без блокировок на get(). Теперь результат можно обрабатывать через "колбэки" — функции, которые вызываются автоматически по завершении.

Пример:
CompletableFuture.supplyAsync(() -> { return "Данные"; }).thenApply(data -> { return data.toUpperCase(); }).thenAccept(System.out::println);.

Здесь supplyAsync запускает задачу асинхронно, thenApply преобразует результат (например, переводит в верхний регистр), thenAccept выводит его.


Есть методы для комбинации: thenCompose для последовательных цепочек, thenCombine для параллельного объединения результатов, handle для обработки ошибок. Это шаг вперёд: код становится declarative (описательным), вы фокусируетесь на "что сделать", а не "как ждать". Нет нужды в ручном get() — всё течёт само.

Но радость недолговечна. Когда приложение усложняется — например, нужно асинхронно запросить данные из базы, потом из внешнего API, обработать ошибки и объединить, — цепочки лямбд растут в "callback-ад" (ад колбэков): вложенные функции, которые трудно читать, отлаживать и тестировать. Один уровень — ок, но пять-шесть — и код превращается в пирамиду, где сложно отследить поток выполнения.

Ещё хуже: под капотом блокировки никуда не делись. Если в цепочке есть блокирующий вызов — например, Thread.sleep() для симуляции задержки или JDBC-драйвер, который ждёт ответа от базы, блокируя поток, — весь CompletableFuture теряет преимущество. Поток из пула всё равно занят ожиданием, и под нагрузкой система снова захлёбывается. Плюс, управление ошибками в цепочках требует осторожности: одна ошибка может сломать всю последовательность, если не обработать timely.

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


#Java #middle #Reactor
👍3
Callback-ад и блокировки: кульминация проблем

Callback-ад — это когда колбэки (функции обратного вызова) наслаиваются друг на друга, делая код нечитаемым. В CompletableFuture это проявляется в глубоких цепочках: thenApply внутри thenCompose, с handle для ошибок. Отладка — кошмар: где именно сломалось? Тестирование — тоже, потому что асинхронность добавляет неопределённость в порядок выполнения.

Блокировки — это когда код "зависает" в ожидании внешнего события, не давая потоку работать с другими задачами. В Java многие библиотеки (как старые IO или JDBC) блокирующие по природе: они используют системные вызовы, которые стопорят поток. Даже в асинхронных конструкциях, если внутри лямбды такая блокировка, весь пул потоков может исчерпаться. Представьте сервер с 100 потоками: 100 запросов с задержкой — и новые ждут в очереди, вызывая таймауты.

Это приводит к неэффективности: CPU простаивает, память тратится на "спящие" потоки, а под пиковой нагрузкой система не масштабируется горизонтально.


Почему нужен новый подход: реактивное программирование

Мы дошли до предела традиционных моделей. Потоки хороши для CPU-bound задач (расчёты), но тяжёлые для IO-bound (сеть, диски). Future дал обещания, но не избавил от блокировок. CompletableFuture улучшил код, но оставил callback-ад и зависимость от неблокирующих библиотек.


Здесь на сцену выходит реактивное программирование — подход, где мы думаем в терминах потоков данных и событий, а не отдельных задач. Вместо "запрос → блокировка в потоке → ответ" мы строим конвейеры: данные приходят асинхронно по мере готовности, обработка идёт реактивно, без выделения потока на каждое ожидание. Это как перейти от конвейера с паузами к непрерывному потоку. В следующих постах разберём Reactive Streams, Flux/Mono в Project Reactor и как это решает проблемы.


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

import java.util.concurrent.*;

public class Task160925 {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> {
Thread.sleep(1000);
return "Done";
});

System.out.println(future.get(500, TimeUnit.MILLISECONDS));
executor.shutdown();
}
}


#Tasks
👍2
👍1
Небольшой анонс на воскресение...🤫

Готовимся🧑‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1
Вопрос с собеседований

Что такое string templates в Java? 🤓

Ответ:

String templates
— интерполяция строк с STR."Hello \{name}".

Пример:
String name = "Alice";
String greeting = STR."Hello \{name}!"; // Hello Alice!

Более безопасны, чем конкатенация, предотвращают инъекции.


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


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

Константи́н Эдуа́рдович Циолко́вский (5 [17] сентября 1857, Ижевское, Рязанская губерния — 19 сентября 1935, Калуга) — российский и советский учёный-самоучка, разрабатывавший теоретические вопросы космонавтики, мыслитель эзотерической ориентации, занимавшийся философскими проблемами освоения космоса.

Майкл Фредрик Сипсер (родился 17 сентября 1954 года) — американский учёный-теоретик в области информатики, внёсший ранний вклад в теорию сложности вычислений. Он является профессором прикладной математики и был деканом факультета естественных наук Массачусетского технологического института.

Крейг Джентри (родился в 1973 году) — американский криптограф; известен тем, что предложил первый практически используемый схемы полностью гомоморфного шифрования.


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

1955первый полёт самолёта (NB-36) с работающим ядерным реактором на борту.

1991 — Линус Торвальдс опубликовал исходный код ядра операционной системы Linux 0.01 весом 64Kb.


#Biography #Birth_Date #Events #17Сентября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Основы ООП в Java

Глава 6. Ключевые модификаторы ООП


Перечисления (enum)

Перечисление (enum) — это специальный класс, который представляет фиксированный набор констант (например, дни недели, цвета или статусы). Enum введен в Java 5 и является полноценным классом, наследующим от java.lang.Enum, но с особым синтаксисом.


Зачем нужен enum:
Типобезопасность: Вместо int или String для констант (где возможны ошибки, как 8 для дня недели), enum гарантирует только допустимые значения.
Читаемость: Код становится самодокументируемым (Day.MONDAY clearer, чем 1).
ООП-функции: Enum может иметь поля, методы, конструкторы.
Переключатели: Идеально для switch, без ошибок.
Неизменяемость: Enum константы immutable и final.


Enum — это абстракция для групп констант, делая код robust и maintainable.


Синтаксис и базовое использование enum

Enum объявляется как класс, но с enum вместо class. Константы перечисляются через запятую.

Синтаксис:
public enum EnumName {
CONSTANT1,
CONSTANT2,
// ...
}


Пример для дней недели:
public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}


Использование:
public class Main {
public static void main(String[] args) {
Day today = Day.WEDNESDAY; // Константа
System.out.println(today); // WEDNESDAY

if (today == Day.WEDNESDAY) { // Сравнение через ==
System.out.println("Середина недели!");
}
}
}


Нюанс: Enum константы — это объекты, но сравниваются через == (не equals, так как уникальные).

Вывод:
System.out.println(today) вызывает toString(), который возвращает имя константы.



Enum с полями, конструкторами и методами

Enum — полноценный класс, так что может иметь private конструкторы, поля и методы. Константы вызывают конструктор.

Пример с полями:

public enum Planet {
MERCURY(3.303e+23, 2.4397e6),
VENUS(4.869e+24, 6.0518e6),
EARTH(5.976e+24, 6.37814e6);

private final double mass; // Масса в кг
private final double radius; // Радиус в м

// Конструктор (private по умолчанию)
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}

// Метод
public double surfaceGravity() {
final double G = 6.67300E-11; // Константа гравитации
return G * mass / (radius * radius);
}
}


Использование:
Planet earth = Planet.EARTH;
System.out.println("Гравитация на Земле: " + earth.surfaceGravity()); // ~9.8


Нюанс: Конструктор private (нельзя new Planet()). Константы — единственные экземпляры.
Методы: Могут быть абстрактными (каждая константа реализует) или обычными.



#Java #для_новичков #beginner #OOP #Enum
👍3
Методы Enum-класса и полезные функции

Enum наследует от Enum<E>, предоставляя методы:
name(): Возвращает имя константы как String.
ordinal(): Порядковый номер (начиная с 0).
valueOf(String name): Возвращает enum по имени.
values(): Массив всех констант.


Пример:
Day[] days = Day.values();
for (Day d : days) {
System.out.println(d + " ordinal: " + d.ordinal());
}

Вывод: MONDAY ordinal: 0, etc.


Нюанс: ordinal() не рекомендуется для логики — лучше поля, так как порядок может измениться.


Switch с enum

Enum идеален для switch — безопасно и читаемо.
public void printDayType(Day day) {
switch (day) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
System.out.println("Рабочий день");
break;
case SATURDAY:
case SUNDAY:
System.out.println("Выходной");
break;
}
}


Нюанс: Нет default, если все случаи покрыты — компилятор не требует.


Все нюансы enum

Наследование и реализация:
Enum не может extends класс (уже extends Enum), но может implements интерфейсы.
Нюанс: public enum MyEnum implements Interface { ... }



Конструкторы и поля:
Конструкторы private.
Константы должны быть первыми в enum, за ними — поля/методы.
Нюанс: Константы с параметрами: CONSTANT(params),


Иммутабельность: Enum константы final и immutable — идеально для singleton.
Сериализация: Enum сериализуется по имени, безопасно.

Ошибки:

Enum с public конструктором — ошибка.
valueOf("INVALID") — IllegalArgumentException.
Enum не может быть abstract, но может иметь abstract методы (константы реализуют).



Дизайн:
Используйте для фиксированных наборов (статусы, типы).
Добавляйте методы для логики.
Нюанс: Nested enum — static по умолчанию.



Как создать это в IntelliJ IDEA

Enum: New → Enum → Planet.
Константы: Напишите MERCURY(3.303e+23, 2.4397e6), — IDE подскажет конструктор.
Методы: Добавьте surfaceGravity() — IDE поможет с override для abstract.
Switch: Напишите switch (day) — IDE сгенерирует cases.



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

Замените int/String константы: Enum safer.
Добавляйте toString(): Переопределите для custom вывода.
Используйте в коллекциях: Set для уникальных.
ordinal() осторожно: Лучше поля для значений.
Ресурсы: Oracle Tutorials on Enum Types.



#Java #для_новичков #beginner #OOP #Enum
👍3
Что выведет код?

enum Status {
ACTIVE, INACTIVE;

Status() {
System.out.print(this.name() + " ");
}
}

public class Task170925 {
public static void main(String[] args) {
System.out.print("Start ");
Status status = Status.ACTIVE;
System.out.print("End");
}
}


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

Что такое interface segregation principle (ISP)? 🤓

Ответ:

ISP (из SOLID)
— принцип, что клиенты не должны зависеть от ненужных методов интерфейса. Лучше несколько маленьких интерфейсов.

Пример: Вместо большого Worker разделить на Eater, Worker.

Улучшает гибкость.


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


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

Жан Берна́р Лео́н Фуко́ (фр. Jean Bernard Léon Foucault; 18 сентября 1819, Париж — 11 февраля 1868, там же)французский физик, механик и астроном, член Парижской Академии наук (1865). Состоял членом Берлинской академии наук, был членом-корреспондентом Петербургской Академии наук (1860), иностранным членом Лондонского королевского общества (1864).

Владимир Александрович Сухомлин (род. 18 сентября 1945, Москва) — доктор технических наук, профессор, заведующий лабораторией открытых информационных технологий факультета ВМК МГУ.

Ю́рий Васи́льевич Гуля́ев (род. 18 сентября 1935) — советский и российский физик, научный руководитель Института радиотехники и электроники РАН (ИРЭ РАН), директор Института нанотехнологий микроэлектроники РАН (ИНМЭ РАН), академик и член Президиума РАН, профессор и заведующий кафедрой твердотельной электроники и радиофизики ФФКЭ МФТИ. Лауреат двух Государственных премий СССР. Почётный доктор Новгородского государственного университета им. Ярослава Мудрого (2013).

Томас Г. Лейн (род. 18 сентября 1955) — специалист по информатике, занимающийся разработкой программного обеспечения с открытым исходным кодом . В опросе 2000 года он был включён в десятку ведущих разработчиков программного обеспечения с открытым исходным кодом, внёс 0,782% от общего объёма кода.

Джеймс Уильям Кули (18 сентября 1926 г. — 29 июня 2016 г.) — американский математик. Кули получил степень бакалавра в 1949 году в Манхэттенском колледже в Бронксе, штат Нью-Йорк, степень магистра в 1951 году в Колумбийском университете в Нью-Йорке, штат Нью-Йорк, и степень доктора философии в 1961 году по прикладной математике в Колумбийском университете. С 1953 по 1956 год он работал программистом на компьютере Джона фон Неймана в Институте перспективных исследований в Принстоне, штат Нью-Джерси, где, в частности, запрограммировал преобразование Блэкмана — Тьюки.


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

1961 в лаборатории люминесценции Физического института АН СССР начал работать первый советский лазер на искусственном кристалле рубина.

1989Релиз NeXTSTEP 1.0 (NeXT, ОС, разработанная командой Стива Джобса).

2024 — число статьей в Русской Википедии достигло 2 миллиона.


#Biography #Birth_Date #Events #18Сентября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3