Java Portal | Программирование
13K subscribers
1K photos
76 videos
33 files
820 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
image_2025-08-10_08-06-12.png
3.4 MB
Дорожная карта освоения Java

🔸Основы Java

Ключевые концепции языка
- Переменные и типы данных
- Операторы и выражения
- Управляющие конструкции
- Массивы и коллекции
- Методы и параметры
- Ввод/вывод и обработка данных

Объектно-ориентированное программирование
- Классы и объекты
- Конструкторы и методы
- Полиморфизм
- Абстракция
- Абстрактные классы
- Интерфейсы

Обработка исключений
- Try-Catch
- Checked и Unchecked исключения
- Throw и Throws
- Best practices по исключениям

🔸Продвинутая Java

Коллекции
- List, Map (HashMap, TreeMap)
- Set (HashSet, TreeSet)
- Очереди и Deque
- Итераторы и листераторы
- Компараторы и Comparable
- Кастомные коллекции

Дженерики и аннотации
- Обобщённые классы и методы
- Wildcards (?, extends, super)
- Встроенные аннотации
- Кастомные аннотации
- Рефлексия и обработка аннотаций

Ввод/вывод и сериализация
- Работа с файлами и потоками
- BufferedReader/Writer
- Scanner
- Сериализация

🔸Многопоточность

Основы потоков
- Thread Class, Runnable Interface
- Жизненный цикл потока
- Методы потока
- Демон-потоки
- Thread Local

Синхронизация
- synchronized методы и блоки
- Wait и Notify
- Lock API
- Producer-Consumer
- Read-Write Lock

Утилиты для многопоточности
- Executor Framework
- Callable и Future
- Concurrent Collections
- Atomic Variables
- Semaphore и Barrier

🔸Современная Java

Lambda и Streams
- Лямбды
- Function, Predicate, Consumer
- Stream API и терминальные операции
- filter, map, reduce
- Optional

Время и дата
- LocalDate/Time, ZonedDateTime
- Duration, Period
- DateTimeFormatter

Новые фичи
- var и ключевое слово yield
- Текстовые блоки
- Pattern Matching
- Sealed Classes
- Virtual Threads

🔸Базы данных и JDBC

JDBC Fundamentals
- Подключение и Connection Management
- Statement, PreparedStatement, ResultSet
- Batch Updates

Операции с БД
- SQL, хранимые процедуры, функции
- Индексы и оптимизация запросов

Основы ORM
- JPA и Hibernate
- Entity Mapping и связи
- HQL, JPQL
- Lazy/Eager Loading

🔸Веб-разработка

Java Web
- Servlets и JSP (жизненный цикл, сервисы, cookies, сессии)
- Spring Framework (Core, MVC, Boot, Security, AOP)
- REST API, Spring Data JPA

Сборка и тестирование
- Maven, Gradle
- JUnit, Mockito
- Интеграционное тестирование
- Логирование (Log4j, SLF4J)

🔸Enterprise Java

- Java EE / Jakarta EE (JPA, JAX-RS, JAX-WS, JMS, JNDI, Bean Validation)
- Микросервисы (Spring Cloud, API Gateway, Service Discovery, Circuit Breaker)
- Message Queues (ActiveMQ, RabbitMQ, Kafka, Apache Pulsar)

🔸Производительность и инструменты

JVM и производительность
- JVM архитектура
- Управление памятью
- Garbage Collector
- Профилирование (JProfiler, VisualVM)

DevTools
- CI/CD (Jenkins, Docker, Kubernetes)
- IntelliJ IDEA, Eclipse, VS Code

Мониторинг и безопасность
- Health Checks
- Метрики
- Аутентификация (OAuth2, JWT)
- OWASP рекомендации

🔸Фреймворки и библиотеки

Web Frameworks
- Spring Boot
- Spring WebFlux
- Struts 2
- JSF
- Play
- Micronaut
- Quarkus

Utility Libraries
- Apache Commons
- Jackson, Gson
- MapStruct
- Lombok

Data & Caching
- Redis
- Elasticsearch
- Ehcache
- Hazelcast
- Apache Ignite

Specialized
- Apache Camel
- Netty
- Akka
- Vert.x


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍2
Часто про блок finally пишут, что он всегда выполнится, даже если в коде случилась ошибка

Пример из разряда «классика жанра»

public class FinallyExample {
public static void main(String[] args) {
try {
System.out.println("Старт");
int result = 10 / 0; // тут бахнет деление на ноль
} catch (ArithmeticException e) {
System.out.println("Ошибка: " + e.getMessage());
} finally {
System.out.println("Этот блок всё равно выполнится");
}
}
}


Да, при делении на ноль выпадет исключение, но перед завершением работы всё, что внутри finally, всё равно выполнится

Но есть ситуации, когда finally не доживёт до выполнения. Например

public class FinallyExample {
public static void main(String[] args) {
try {
System.out.println("Старт");
System.exit(0); // мгновенный выход из программы
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Ошибка: " + e.getMessage());
} finally {
System.out.println("Этот блок уже не увидим");
}
}
}


Вызов System.exit() или убийство процесса извне (например, kill PID) не даст finally сработать

Теперь к более интересному

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

Пусть методы вызывают друг друга вот так:

mainfirstLogicsecondLogicthirdLogicfourthLogic

Пример

public static void main(String[] args) {
try {
firstLogic();
} finally {
System.out.println("FINALLY MAIN"); // логируем результат
}
}

public static void firstLogic() {
secondLogic();
}

public static void secondLogic() {
try {
thirdLogic();
} finally {
System.out.println("FINALLY SECOND"); // отправляем уведомление
}
}

public static void thirdLogic() {
fourthLogic();
}

public static void fourthLogic() {
System.out.println("D");
throw new RuntimeException();
}


В этой схеме исключение может вылететь и в thirdLogic, и в fourthLogic
Нам всё равно, где именно упало — код внутри finally, в main и secondLogic всё равно выполнится

Это удобно, когда логика сложная и методы вызывают друг друга

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Паттерн проектирования Memento

🔸Сценарий: создание текстового редактора

Вы пишете текстовый редактор и вам нужна функциональность undo/redo.
Пользователь вводит, удаляет, форматирует текст и ожидает возможность откатить изменения к предыдущему состоянию.

// Пользователь ввёл: "Hello"
// Пользователь ввёл: " World"
// Пользователь удалил: "World"
// Пользователь хочет откатить → восстановить "World"
// Пользователь хочет откатить снова → восстановить "Hello"


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

🔸Проблемы без Memento

- Доступ к внутренним полям - нужно лезть в приватные данные объекта для сохранения/восстановления состояния
- Сложная логика отката - откат каждого типа операций приходится писать вручную
- Сильная связка - логика undo перемешана с бизнес-логикой
- Прожорливость памяти - хранение целых объектов вместо снапшотов

🔸Как помогает Memento

Паттерн Memento говорит

> «Позволь объектам сохранять и восстанавливать своё состояние через снапшоты, не раскрывая внутренние детали».


Flow

1. Создать снимок состояния
2. Сохранить в Caretaker
3. Продолжить работу
4. Запросить откат
5. Восстановить состояние

🔸Три ключевых компонента

- Originator - объект, чьё состояние нужно сохранить (например, документ)
- Memento - снимок состояния в определённый момент времени
- Caretaker - управляет снапшотами, но не может их изменять

🔸Когда использовать Memento

- Undo/Redo в редакторах, играх, формах
- Транзакционный откат в базах данных или операциях
- Чекпоинты в долгих процессах
- История состояния для отладки или аудита

🔸Преимущества

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

🔸Примеры

- Текстовые редакторы - Ctrl+Z с сохранением состояния документа
- Фоторедакторы - панель истории шагов редактирования
- Игры - сохранения и чекпоинты
- Транзакции в БД - откат при сбое

🔸Недостатки

- Память - хранение множества снапшотов
- Производительность - создание снапшотов требует времени
- Сложность для больших объектов - глубокое копирование может быть дорогим

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥76👍2
Бесплатный API для получения полной информации об IP-адресе.

Без регистрации и каких-либо ограничений.

Работает с Python, JavaScript, Java, PHP, Go и другими языками.

Пример использования: https://api.ipquery.io/1.1.1.1

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4🌚3🤔2
Проект многопоточный загрузчик файлов на Java отлично подходит для изучения

Учит разбираться в многопоточности и конкурентности

Прокачивает навыки в:

> работе с данными
> файловом вводе-выводе
> многопоточности
> конкурентности
> работе с диапазонами Content-Length в HTTP-запросах

и не только 💪

Вот один из проектов к примеру: https://github.com/winnerx0/java-project-box

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3🔥1
Media is too big
VIEW IN TELEGRAM
Научись создавать проекты с нуля на любом языке программирования

Репо: https://github.com/practical-tutorials/project-based-learning

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
6
Метод limit в Java Stream API кратко

Иногда нужно вытащить только первые N элементов коллекции например для пагинации отладки или быстрого превью. В Stream API за это отвечает limit который делает это простым и аккуратным способом

limit(long maxSize) создает новый поток и берет не больше n элементов из исходного. Остальные элементы пропускаются и дальше не обрабатываются

Пример ниже

  import java.util.List;
import java.util.stream.Collectors;

public class LimitExample {
public static void main(String[] args) {
List<String> items = List.of("A", "B", "C", "D", "E");

List<String> limited = items.stream()
.limit(3)
.collect(Collectors.toList());

System.out.println(limited); // [A, B, C]
}
}


Какой бы ни была длина исходной коллекции результат содержит максимум n элементов

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Паттерны проектирования систем - шпаргалка

🔸Webhooks и Outbox
Надёжные внешние уведомления.
Когда использовать — интеграции, сторонние колбэки.
Типичные проблемы — статусы оплат, синхронизация CRM.

🔸Blob/Object Storage
Дешёвое хранение больших файлов.
Когда использовать — медиа, бэкапы, экспорты.
Типичные проблемы — загрузки пользователей, data lake.

🔸Оркестратор задач (Airflow/Temporal)
Долгоживущие процессы с состоянием.
Когда использовать — длинные задачи, SLA.
Типичные проблемы — генерация отчётов, обработка видео.

🔸Blue-Green / Canary деплой
Постепенное переключение трафика.
Когда использовать — безопасные релизы, быстрый откат.
Типичные проблемы — деплой API, смена конфигураций.

🔸Feature Flags
Включение/отключение фич на лету.
Когда использовать — эксперименты, переключатели.
Типичные проблемы — A/B тесты, скрытые релизы.

🔸Стратегия миграции схемы
Обратная/прямая совместимость.
Когда использовать — миграция без простоя БД.
Типичные проблемы — expand-migrate-contract.

🔸Распределённые блокировки / выбор лидера
Координация одного активного воркера.
Когда использовать — уникальность cron, шардовое владение.
Типичные проблемы — один консумер, лидер партиции.

🔸Наблюдаемость (логи/метрики/трейсы)
Понимание, что делает система.
Когда использовать — SLO, отладка, планирование.
Типичные проблемы — задержка p99, error budget.

🔸Безопасность: AuthN/AuthZ
Проверка личности и прав доступа.
Когда использовать — мультиарендные продукты, внешние API.
Типичные проблемы — OAuth2/OIDC, RBAC/ABAC.

🔸Мультиарендность (pool/bridge/isolated)
Уровни изоляции данных и ресурсов.
Когда использовать — SaaS с множеством клиентов.
Типичные проблемы — отдельные БД на арендатора vs общая схема.

🔸Edge Compute/функции
Запуск логики ближе к пользователю.
Когда использовать — низкая задержка, лёгкие задачи.
Типичные проблемы — персонализация на краю, A/B тесты.

🔸Rate-Aware DB Patterns
Пакетная, очередная, троттлинг у БД.
Когда использовать — горячие партиции, блокировки.
Типичные проблемы — массовый импорт, ID hotspot.

🔸Стратегии пагинации
Keyset > Offset для больших данных.
Когда использовать — бесконечный скролл, большие таблицы.
Типичные проблемы — пагинация фидов, списки в админке.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53
This media is not supported in your browser
VIEW IN TELEGRAM
Кто до сих пор путается в деревьях, графах и сортировках, вот топчик:

https://visualgo.net/en

Визуалка чисто для мозга, всё анимировано: стек, очередь, DFS, BFS, сортировки, хэш-таблицы.

Как будто смотришь, как думает комп. Залипнуть можно. 😳

Сохрани

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
7
Освой планирование в Spring Boot с помощью Cron-задач и начальной задержки.

🔸Cron Job

Планировщик cron запускает задачи в определённое время, используя cron-выражение.

Это самый гибкий способ планировать задачи в Spring Boot — можно запускать их ежедневно, еженедельно, ежемесячно или по любому заданному шаблону.
Пример ниже выполняется каждый день в 9:00 утра по времени IST.

@Scheduled(cron = "0 0 9 * * ?", zone = "Asia/Kolkata")
public void runCron() {
System.out.println("Daily at 9:00 AM");
}


Формат cron: секунда минута час день месяц деньНедели

Примеры:

0 0 0 * * ? → каждый день в полночь

0 0/15 * * * ? → каждые 15 минут

Используйте cron, когда нужна точность, например для генерации отчётов в конце дня.

🔸Initial Delay

Параметр initialDelay говорит Spring Boot, сколько ждать после запуска приложения перед первым выполнением задачи.

После первого запуска задача будет работать с указанным fixedRate или fixedDelay.

Пример: код ниже ждёт 10 секунд после старта, затем выполняется каждые 5 секунд от начала предыдущего запуска.

@Scheduled(initialDelay = 10000, fixedRate = 5000)
public void runWithDelay() {
System.out.println("Starts after 10s, then every 5s");
}


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

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM