Java библиотека
31.6K subscribers
2.32K photos
78 videos
8 files
2.05K links
Книги, статьи, мемы и многое другое для Java программиста!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrT4A

Мы на бирже: https://telega.in/c/javalib/

Сообщество VK https://vk.com/javatutorial
Download Telegram
🌳 AVL, Red-Black и обычные BST — в чём разница и что использовать

Если вы работаете с алгоритмами или backend-структурами, важно понимать, чем отличаются разные виды бинарных деревьев поиска. Они вроде бы похожи, но ведут себя по-разному под нагрузкой.

📘 1. Обычное BST (Binary Search Tree)

🟢Это простое бинарное дерево, где:
> левый элемент < корень < правый элемент

🟢Плюсы:
– простая реализация
– отлично работает в идеальных условиях (например, сбалансированные данные)

🟢Минусы:
– если данные приходят в отсортированном виде — дерево вырождается в связный список
– время поиска, вставки, удаления может стать O(n) вместо O(log n)

📗 2. AVL-дерево

🟢Это самобалансирующееся BST, в котором:
> разница высот левого и правого поддерева никогда не превышает 1

🟢Плюсы:
очень быстрое чтение и поиск (потому что дерево строго сбалансировано)
– гарантированное O(log n) на все операции

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

📌 Используется, когда важна максимально быстрая навигация по дереву (например, базы данных, кэшированные индексы)

📕 3. Red-Black Tree (Красно-чёрное дерево)

🟢Более "гибкое" самобалансирующееся дерево
> баланс поддерживается за счёт цветов узлов и набора правил
> менее строгое, чем AVL, но быстрее на изменениях

🟢Плюсы:
– меньше вращений при вставке/удалении
лучше масштабируется, особенно при больших объёмах данных
– используется в TreeMap (Java), std::map (C++), Linux kernel

🟢Минусы:
– чуть менее сбалансировано, чем AVL
поиск может быть чуть медленнее, но разница минимальна

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

🧠 Итого:

| Структура | Быстрее при... | Баланс | Где применяется |
|----------------|------------------------|--------|----------------------------------------|
| **BST** | — (только в идеале) | нет | учебные задачи, простые деревья |
| **AVL** | Поиске | строгий | базы данных, индексы, словари |
| **Red-Black** | Вставке/удалении | ⚠️ умеренный | языковые stdlib, ядра, runtime-структуры |


🔗 Подробнее

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93🔥1
Реактивное программирование для масштабируемых приложений

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

🟢Зачем это нужно

— Обеспечивает асинхронную обработку данных с поддержкой backpressure — контроль потока данных, чтобы не перегружать систему.
— Улучшает использование ресурсов: вместо блокировки потоков реактивный код работает с событиями и колбэками.
— Позволяет строить сложные цепочки обработки с лаконичным и выразительным API (Flux, Mono).
— Отлично интегрируется с Spring WebFlux — современным реактивным веб-фреймворком.

🟢Как использовать

— Подключите зависимость reactor-core в проект.
— Используйте Mono<T> для 0-1 элемента, Flux<T> — для потоков данных.
— Пример:
Flux.just("user1", "user2", "user3")
.flatMap(this::fetchUserDetailsAsync)
.filter(user -> user.isActive())
.subscribe(user -> System.out.println("Active user: " + user.getName()));

— Обрабатывайте ошибки реактивно с помощью операторов onErrorResume, retry.
— Используйте Schedulers для переключения потоков и оптимизации выполнения.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍76🔥4
🌐 JTS Topology Suite — мощная Java-библиотека для работы с геометрией. Проект предоставляет инструменты для создания и манипуляции векторной геометрией, включая пространственные операции. Входит в рабочую группу LocationTech Eclipse Foundation и служит основой для многих GIS-решений.

В комплекте идёт TestBuilder с GUI для визуализации геометрии и тестирования функций. Библиотека особенно полезна разработчикам GIS-приложений систем пространственного анализа. На базе JTS построены популярные порты для C++, .NET и JavaScript.

🖥 GitHub

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍54🔥4
👩‍💻 Интеграция Redis в Spring Boot с AI

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

📝 Промпт:
Generate a Spring Boot service that integrates with Redis to handle [caching / rate limiting / distributed locks / task queues] for [описание бизнес-логики].  
Include configuration, connection pooling, and example use cases.
Ensure reliability with TTL management, error handling, and fallback mechanisms.
Use Spring Data Redis or Lettuce/Jedis client. Explain the trade-offs of chosen technologies and patterns (e.g., Cache Aside, Write-Through).


💡 Дополнительные возможности:

— Добавьте also include support for Redis Streams (or Pub/Sub) for event-driven processing with examples для включения Redis Streams или Pub/Sub.
— Добавьте use Lua scripts for atomic operations and provide sample use cases (e.g., rate limiting or locking) для Lua-скриптов.
— Добавьте integrate Spring Boot Actuator and Redis metrics for monitoring cache performance (hit/miss, TTL, etc.) для мониторинга кеша и статистики.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍5🔥3
🖥 Logback Access Reactor Netty — управление access-логами для реактивных веб-приложений на Java и Kotlin. Этот проект предоставляет интеграцию популярной Java библиотеки Logback-access с HTTP-сервером Reactor Netty, на которым построен реактивный стек Spring WebFlux.

Инструмент доступен для использования двумя способами: в виде Spring Boot стартера для Spring Boot приложений и в виде отдельной библиотеки для приложений, которые используют Reactor Netty HTTP Server напрямую. Настройка простая: достаточно подключить зависимость в проект и добавить файл logback-access.xml с Logback конфигурацией access-логов (appender, encoder, pattern).

🖥 GitHub

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43🔥3
👩‍💻 Как настроить JWT аутентификацию в Spring Boot

Для настройки JWT аутентификации в Spring Boot следуйте этим шагам:

1️⃣ Добавьте зависимости
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.11.5</version>
</dependency>


2️⃣ Создайте класс для генерации JWT
public class JwtTokenUtil {
private static final String SECRET_KEY = "secretKey";

public static String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}

public static String getUsernameFromToken(String token) {
return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();
}

public static boolean isTokenExpired(String token) {
return getExpirationDateFromToken(token).before(new Date());
}

private static Date getExpirationDateFromToken(String token) {
return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getExpiration();
}

public static boolean validateToken(String token, String username) {
return (username.equals(getUsernameFromToken(token)) && !isTokenExpired(token));
}
}


3️⃣ Создайте фильтр для JWT токенов
public class JwtAuthenticationFilter extends OncePerRequestFilter {
private static final String HEADER_STRING = "Authorization";
private static final String TOKEN_PREFIX = "Bearer ";

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String header = request.getHeader(HEADER_STRING);

if (header != null && header.startsWith(TOKEN_PREFIX)) {
String token = header.substring(TOKEN_PREFIX.length());

try {
if (JwtTokenUtil.validateToken(token, JwtTokenUtil.getUsernameFromToken(token))) {
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
JwtTokenUtil.getUsernameFromToken(token), null, new ArrayList<>());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
} catch (ExpiredJwtException e) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
}
}

filterChain.doFilter(request, response);
}
}


4️⃣ Настройте Spring Security
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter());
}
}


5️⃣ Создайте контроллер для логин
@RestController
public class AuthController {

@PostMapping("/login")
public String login(@RequestBody AuthRequest authRequest) {
if ("admin".equals(authRequest.getUsername()) && "admin123".equals(authRequest.getPassword())) {
return JwtTokenUtil.generateToken(authRequest.getUsername());
}
return "Invalid credentials";
}
}


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
16👍10🔥5
⚠️ Чем опасен Scheduled(fixedRate) без Transactional в Spring?

Многие используют @Scheduled для запуска задач по таймеру, но забывают об одной критичной вещи — транзакциях. Особенно если указан fixedRate.

👎 Проблема:

Если метод выполняется дольше, чем интервал fixedRate, запускается второй поток, который снова возьмёт те же данные.
Результат — дублирование обработки, гонки, порча данных.

Пример:

@Scheduled(fixedRate = 10_000)
public void cleanUp() {
List<Job> jobs = jobRepository.findAllByStatus(PENDING);
jobs.forEach(job -> {
job.setStatus(PROCESSING);
jobRepository.save(job);
});
}



💥 Через 10 секунд начнёт работать следующий вызов, даже если первый ещё не закончен.

Решение: обернуть в @Transactional и использовать блокировки:


@Transactional
@Scheduled(fixedRate = 10_000)
public void cleanUp() {
List<Job> jobs = jobRepository.findAllByStatusForUpdate(PENDING);
...
}



📌 Также можно:
— использовать fixedDelay вместо fixedRate — он ждёт окончания предыдущей задачи
— добавить флаг locked, чтобы явно помечать уже взятые задачи
— заменить @Scheduled на более надёжные инструменты:

🟢Spring Batch — для сложных задач
🟢Spring Integration / Camunda — если нужны гарантии и retry
🟢Quartz — если важны очередь и контроль запуска

🔧 Не упирайтесь в @Scheduled, если задача критична к повторной обработке.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍6🔥5😁1
🧑‍💻 Магия IntelliJ IDEA

Когда нужно аккуратно скопировать блок кода, метод, выражение или просто цепочку вызовов — забудьте про мышь. У IntelliJ есть инструмент поумнее.

Хоткей: Ctrl + W (или Cmd + W на macOS)

🟢Что делает

По нажатии IDEA «расширяет» выделение:
— сначала слово,
— потом выражение,
— затем строку целиком,
— потом блок кода,
— и так до всего метода или класса.

🟢Зачем это нужно

— Быстро выделить логически связанный фрагмент без лишней возни.
— Удобно вырезать или перемещать части кода.
— Работает даже внутри строк, SQL-запросов, JSON и XML.

🟢Как использовать

— Поставьте курсор в нужное место.
— Нажимайте Ctrl + W по очереди — и наблюдайте, как IDEA понимает структуру кода.
— Ctrl + Shift + W — отменяет шаг назад.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥154
🧱 Maven vs. ⚡️Gradle — что выбрать разработчику?

Когда речь заходит о сборке Java-проектов, чаще всего выбор стоит между двумя фреймворками: Maven и Gradle. Оба стали стандартом в индустрии, но у каждого — свои сильные и слабые стороны. Разбираем, кому что подойдёт 👇

🟢Maven — стабильная классика:

Строгая структура: легко читать и сопровождать
Надёжность и предсказуемость сборки
Много плагинов и готовых решений
⚠️ XML-конфигурация громоздкая
⚠️ Медленнее по сравнению с Gradle

🟡Gradle — гибкость и скорость:

Поддержка Kotlin и Groovy DSL
Инкрементальные сборки и кэширование
Гибкий подход к конфигурации
⚠️ Порог входа выше
⚠️ Сложности с отладкой настроек

📌 Вывод:

🟢 Выбирай Maven, если важны стабильность, читаемость и простота
🟡 Выбирай Gradle, если хочешь максимум производительности и гибкости

💬 В крупных проектах Gradle становится всё популярнее, особенно с Kotlin.
Но в enterprise-среде Maven по-прежнему остаётся стандартом.

А ты чем пользуешься? Делись в комментариях👇

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍3🔥3
👩‍💻 Генерация REST API на Spring Boot с AI

Нужно быстро развернуть REST API c валидацией, логированием, DTO, безопасностью и документацией?
AI справится с этим за один промпт — код будет готов к продакшну, с учетом архитектурных паттернов.

📝 Промпт:

Generate a Spring Boot REST API for managing [сущность или бизнес-логика, например: product catalog, user profiles, task assignments].
Include CRUD endpoints, validation (Hibernate Validator), exception handling, DTO mapping (MapStruct or ModelMapper), and OpenAPI documentation.
Ensure security with JWT-based authentication and role-based access control (Spring Security).
Use layered architecture (Controller → Service → Repository) and follow clean code principles. Add unit tests for controller and service layers.


💡 Расширения:

— Добавьте integrate with PostgreSQL using Spring Data JPA and specify indexes/constraints для подключения к БД.
— Добавьте support pagination and filtering with Pageable and Specification API для удобных выборок.
— Добавьте plug into CI/CD pipeline with Docker and GitHub Actions для продвинутого автодеплоя.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥97👍5😁1
🖥 Java‑задача для тех, кто не боится `Concurrency` и `Immutable`

Представьте, что вы пишете in-memory кеш конфигураций. У вас есть ConfigService, который должен:

🔘Загружать конфигурации из базы (эмулируется loadConfigFromDB())
🔘Раздавать *текущую* версию конфигурации многопоточным клиентам
🔘Давать 100% thread‑safety и 0 блокировок
🔘Позволять hot‑reload без блокировки клиентов
🔘Гарантировать, что ни один поток никогда не увидит "смешанную" конфигурацию

🔧 Что нужно сделать:
Реализуйте ConfigService, который использует AtomicReference<Config> и Immutable-объекты, чтобы:

1. Конфигурация всегда была консистентной
2. Потоки не блокировали друг друга
3. Обновления конфигурации были моментальными и безопасными

📦 Пример API:

class ConfigService {
public Config getCurrentConfig(); // read-only, вызывается часто
public void reload(); // обновить конфиг, редко
}



🧠 Хитрость: нельзя использовать synchronized, volatile массивы, CopyOnWrite, ReentrantLock, и т.п. — только атомарность и неизменяемость.

🚀 Challenge accepted?

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍65
Java Совет 🖥
Как понять, что Java‑код мог быть сгенерирован ИИ?

🟢Если вы видите в коде Collectors.toList(), а не Stream.toList() — это явный намёк 😉

Stream.toList() появился только в Java 16.
А Collectors.toList() — с нами ещё с Java 8, поэтому его до сих пор полно в туториалах, на Stack Overflow и во всех датасетах, на которых обучают ИИ.

📌 Документация

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
😁16👍65🔥4🎉1