Java библиотека – Telegram
Java библиотека
31.5K subscribers
2.37K photos
89 videos
10 files
2.17K links
Книги, статьи, мемы и многое другое для Java программиста!

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

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

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

Сообщество VK https://vk.com/javatutorial
Download Telegram
Sorted set

SortedSet — это интерфейс в Java Collection Framework, который предоставляет упорядочение элементов в множестве. Элементы упорядочиваются с помощью их естественного порядка или с помощью компаратора, который обычно предоставляется при создании отсортированного множества.

SortedSet имеет несколько дополнительных операций, которые позволяют использовать упорядочение элементов:
— first() и last() возвращают первый и последний элементы в множестве соответственно.
— headSet(), tailSet() и subSet() возвращают подмножества элементов, которые находятся до, после или между заданными элементами соответственно.

В этом примере мы создаем TreeSet (класс, который реализует SortedSet) и добавляем в него несколько строк. Поскольку строки реализуют интерфейс Comparable, они упорядочиваются в алфавитном порядке. Затем мы используем различные методы SortedSet для получения первого и последнего элементов, а также подмножеств элементов.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍115🔥4
CompletableFuture

CompletableFuture в пакете java.util.concurrent является классом, который предоставляет мощный и гибкий подход к асинхронному программированию. Он позволяет выполнять асинхронные операции и обрабатывать их результаты, комбинировать несколько операций и управлять зависимостями между ними.

Помимо операций, представленных на изображении, CompletableFuture также предоставляет множество других методов для работы с асинхронными операциями, таких как thenApply(), thenCompose(), thenCombine(), exceptionally() и другие, которые позволяют обрабатывать результаты, комбинировать операции, обрабатывать исключения и многое другое. Это делает CompletableFuture мощным инструментом для асинхронного программирования.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍5🔥4
Агрегация: что это и когда использовать?

Агрегация — это тип отношения между классами, при котором один класс "владеет" экземпляром другого, но их жизненные циклы не зависят друг от друга. Это «слабое» отношение, так как объект одного класса может существовать независимо от объекта другого.

Пример:

class Engine {
void start() {
System.out.println("Двигатель запущен");
}
}

class Car {
private Engine engine;

Car(Engine engine) {
this.engine = engine;
}

void startCar() {
engine.start();
System.out.println("Машина поехала");
}
}

public class Main {
public static void main(String[] args) {
Engine engine = new Engine(); // Двигатель может существовать отдельно
Car car = new Car(engine);
car.startCar();
}
}


🟢В этом примере класс Car агрегирует объект Engine, но двигатель может существовать сам по себе, вне машины.

Агрегацию стоит использовать, когда один объект логически принадлежит другому, но их существование не связано напрямую. Например, библиотека и книги, где книги могут существовать без самой библиотеки

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍6🔥5
Композиция: что это и когда использовать?

Композиция — это тип отношения, когда один класс жёстко связан с другим, и объекты не могут существовать независимо. Если контейнерный объект уничтожается, то и все объекты, которые он содержит, также будут уничтожены.

Пример:

class Heart {
void beat() {
System.out.println("Сердце бьется");
}
}

class Human {
private final Heart heart;

Human() {
this.heart = new Heart(); // Сердце создаётся вместе с человеком
}

void live() {
heart.beat();
System.out.println("Человек живёт");
}
}

public class Main {
public static void main(String[] args) {
Human human = new Human();
human.live();
}
}


🔹 В этом примере класс Human композирует объект Heart, и сердце не может существовать вне человека.

Композицию стоит использовать, когда объекты должны быть тесно связаны и уничтожаться вместе. Например, птица и её крылья — без птицы существование крыльев не имеет смысла.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍197🔥4
Media is too big
VIEW IN TELEGRAM
Оптимизация неблокирующего TCP сервера на java (NIO)

В предыдущем видео Неблокирующий TCP сервер на java (NIO) был разработан TCP сервер.
Сейчас проведем нагрузочное тестирование и оптимизируем потребление памяти.


🌐🗣СМОТРЕТЬ VKVIDEO

📺🗣СМОТРЕТЬ RUTUBE

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥54👍4
Selector

Класс Selector используется для организации многоканального неблокирующего ввода-вывода.
Основная идея в том, что Selector позволяет одному потоку следить за состоянием множества каналов (сокетов, файловых каналов) и обрабатывать их события (готовность к чтению/записи).

Возможности Selector:
— Регистрация множества каналов в Selector для мониторинга.
— Проверка готовности зарегистрированных каналов к операциям чтения, записи.
— Извлечение готовых каналов и выполнение операций с ними.
— Отмена регистрации каналов в Selector.

Использование Selector позволяет избежать блокировки на операциях чтения/записи по каналам и эффективно масштабировать приложение для одновременной работы с большим количеством соединений.
Класс часто применяется в сетевых серверах для неблокирующей обработки большого числа клиентских соединений в одном потоке.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍8🔥3
Media is too big
VIEW IN TELEGRAM
Java и gRPC: быстрый старт со Spring Boot | Преимущества, Настройка и Использование

Сегодня у нас QuickStart и обзор ныне очень популярной технологии - gRPC, оставляйте свое мнение в комментариях и читайте описание, приятного! :)

📺🗣СМОТРЕТЬ RUTUBE

🌐🗣СМОТРЕТЬ VKVIDEO

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥32
Как отслеживать изменения в файловой системе в реальном времени

Если вам нужно отслеживать изменения в файловой системе, такие как добавление, удаление или модификация файлов, Java предоставляет удобный инструмент — интерфейс WatchService. Это идеальное решение для мониторинга директорий без необходимости вручную проверять состояние файлов каждый раз.

🔹 Возможные сценарии использования:

- Отслеживание действий пользователя.
- Мониторинг изменений в конфигурационных файлах для их динамической перезагрузки.
- Автоматическая обработка данных, как только они поступают в систему (например, новые изображения или документы).
- Логирование и анализ активности в системных директориях.

import java.nio.file.*;
import java.io.IOException;

public class DirectoryWatcher {
public static void main(String[] args) throws IOException, InterruptedException {
WatchService watchService = FileSystems.getDefault().newWatchService();
Path path = Paths.get("/path/to/watch");
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);

System.out.println("Monitoring directory: " + path);

while (true) {
WatchKey key = watchService.take();
key.pollEvents().forEach(event -> {
WatchEvent.Kind<?> kind = event.kind();
System.out.println(kind.name() + ": " + event.context());
});
if (!key.reset()) break;
}
}
}


WatchService — это механизм мониторинга событий файловой системы. Для его работы регистрируем путь для отслеживания событий с помощью path.register() и указываем тип событий: создание, удаление или модификация.
В бесконечном цикле программа ожидает события с помощью watchService.take(), после чего события обрабатываются через лямбду.
Метод reset() проверяет, можно ли продолжить отслеживание, если нет — цикл завершится.

🔹 Преимущества использования:
- Моментальное реагирование на изменения файлов, что упрощает автоматизацию.
- Легкая настройка — всего несколько строк кода для полного мониторинга директории.
- Минимальные ресурсы — WatchService не требует постоянного опроса файловой системы.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍96
StringBuilder

StringBuilder — это класс для работы с изменяемыми строками, аналогичный StringBuffer. API класса StringBuilder такой же, как у StringBuffer, он также хранит строку в виде модифицируемого массива символов.

Но, в отличие от StringBuffer, StringBuilder не является потокобезопасным. Он работает быстрее за счет отсутствия синхронизации.
Поэтому его рекомендуется использовать в однопоточных приложениях для работы со строками, когда нет необходимости в синхронизации.

При создании можно задать начальную емкость buffer'а в виде размера массива символов.
Если строка превышает текущую емкость, она автоматически расширяется с сохранением содержимого.


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍124🔥2
Можем ли мы перегрузить методы по возвращаемому типу?

Мы не можем перегружать по возвращаемому типу. Это поведение аналогично C++.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍134🔥2
ReentrantLock vs. Lock

Lock — это интерфейс, предоставляющий базовые методы для управления синхронизацией потоков. Одной из наиболее популярных реализаций этого интерфейса является ReentrantLock, которая предлагает более широкие возможности по сравнению с базовыми реализациями. Разбираемся, в чём различие:

🔵 Повторный захват
ReentrantLock позволяет одному и тому же потоку захватывать блокировку несколько раз. Это полезно, если метод вызывается рекурсивно или используются несколько блокировок одновременно.

🔵 Больше контроля
ReentrantLock даёт больше возможностей управления блокировкой: можно настраивать справедливость (потоки захватывают блокировку по очереди) и использовать неблокирующие методы, такие как tryLock(), чтобы избежать ожидания.

🔵 Управление состоянием
С ReentrantLock блокировку можно вручную освобождать, что полезно при более сложной логике.

🔵 Дополнительные методы
ReentrantLock предоставляет такие полезные методы, как getHoldCount(), чтобы узнать, сколько раз текущий поток захватил блокировку, и isHeldByCurrentThread() для проверки, удерживается ли она этим потоком.

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

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍85🔥4
Media is too big
VIEW IN TELEGRAM
Spring AI Advisors: Intercept & Enhance Every AI Call (AOP for AI!)

Discover the power of Spring AI Advisors - the AOP-style solution that lets you intercept, modify, and enhance every AI interaction in your Spring applications!

In this tutorial, you'll learn how to add logging, memory, and retrieval-augmented generation (RAG) capabilities to your Spring AI applications without cluttering your business logic. Think of advisors as Aspect-Oriented Programming (AOP) for AI interactions!

What You'll Learn:
• Built-in Advisors: Question & Answer Advisor for RAG and Chat Memory Advisor for conversation history
• Custom Advisor Development: Build your own logging advisor that captures requests, responses, and metadata
• Real-World Implementation: Complete code examples using OpenAI integration and vector stores
Observability Integration: How advisors participate in metrics and tracing
• Best Practices: When to use blocking vs streaming advisor implementations


🌐🗣СМОТРЕТЬ VKVIDEO

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍3🔥2
Java Bean

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

Основные характеристики JavaBeans:

1. Класс должен быть публичным и иметь открытый конструктор без аргументов.
2. Приватные поля класса должны быть доступны с помощью геттеров и сеттеров (
getter и setter методы).
3. Класс должен быть сериализуемым, то есть должен реализовывать интерфейс
Serializable.

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

@javalib #java
👍105🔥3🎉1
Паттерн Factory (Фабрика)

Factory — это порождающий паттерн, который предоставляет интерфейс для создания объектов в суперклассе, но позволяет подклассам изменять тип создаваемых объектов.

Использование:

🔹 Когда заранее неизвестны конкретные классы объектов, с которыми придётся работать.
🔹 Когда нужно централизовать логику создания объектов, чтобы избежать дублирования кода.
🔹 Когда система должна быть независимой от процесса создания, композиции и представления объектов.

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

1️⃣ Снижает связанность кода с конкретными классами, делая систему более гибкой.
2️⃣ Улучшает структуру кода за счёт выделения логики создания объектов в отдельные классы.
3️⃣ Упрощает добавление новых типов объектов, не изменяя существующий код.

Недостатки:

1️⃣ Увеличивает количество классов в проекте, что усложняет его поддержку.
2️⃣ Требует понимания принципов абстракции и иерархий, что может усложнить первоначальное восприятие.

📌 Factory широко применяется для создания объектов в системах, где тип создаваемого объекта зависит от условий, например, в логике обработки различных пользовательских запросов или для генерации разных типов документов.

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍136🔥4
ListIterator

ListIterator — это интерфейс итератора, предназначенный специально для работы со списками.

В отличие от обычного Iterator, ListIterator позволяет не только итерировать список в прямом направлении, но и в обратном.
Он поддерживает операции для перемещения вперед и назад по списку.

ListIterator реализует методы:
— next(): переход к следующему элементу.
— previous(): переход к предыдущему элементу.
— hasNext(): проверка, есть ли следующий элемент.
— hasPrevious(): проверка, есть ли предыдущий элемент.
— add(): добавление элемента в список.

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


Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍6🔥4
Что такое механизм try-with-resources?

Данная конструкция, которая появилась в Java 7, позволяет использовать блок try-catch не заботясь о закрытии ресурсов, используемых в данном сегменте кода. Ресурсы объявляются в скобках сразу после try, а компилятор уже сам неявно создаёт секцию finally, в которой и происходит освобождение занятых в блоке ресурсов. Под ресурсами подразумеваются сущности, реализующие интерфейс java.lang.Autocloseable.

Стоит заметить, что блоки catch и явный finally выполняются уже после того, как закрываются ресурсы в неявном finally.


@javalib #java
12👍9🔥4
Паттерн Мост (Bridge)

Bridge — это структурный паттерн, который разделяет абстракцию и её реализацию, позволяя изменять их независимо друг от друга. Это достигается созданием интерфейса (абстракции) и его конкретных реализаций, которые можно менять, не влияя на абстракцию.

Использование:


🔹 Когда нужно разделить сложные системы на отдельные, независимые части.
🟢Когда требуется поддерживать множество вариантов реализации для одной и той же абстракции.
🟢Когда необходимо минимизировать связанность между абстракцией и её реализацией, делая систему более гибкой и расширяемой.

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

1️⃣ Снижает связанность между абстракцией и реализацией, что упрощает модификации.
2️⃣ Позволяет изменять реализации без изменения кода абстракции.
3️⃣ Упрощает расширение системы за счёт добавления новых абстракций и реализаций.

Недостатки:

1️⃣ Увеличивает сложность проекта из-за необходимости введения дополнительных классов.
2️⃣ Могут возникнуть трудности с отладкой, если абстракция и реализация сильно изолированы.

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

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍6🔥4
Forwarded from Java Guru 🤓
Что будет при вызове /api/customers/{5}, если записи c id 5 нет
👍8🔥42
Forwarded from Java Guru 🤓
😁15👍10🔥51🎅1
Media is too big
VIEW IN TELEGRAM
👩‍💻 Твоё первое приложение на Spring Boot: Пошаговое руководство

Узнайте, как начать работу с java и spring framework, создав своё первое приложение всего за несколько простых шагов! В этом руководстве мы покажем, как подключить ваше приложение к mysql. 👨‍💻 Независимо от вашего уровня опыта, вы сможете быстро освоить основы и начать разработку. 🚀

📺🗣СМОТРЕТЬ RUTUBE

🌐🗣СМОТРЕТЬ VKVIDEO

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍3🔥2😁2
Как устроен под капотом LinkedHashMap?

LinkedHashMap — это реализация интерфейса Map, которая сохраняет порядок добавления элементов. В отличие от обычного HashMap, где элементы могут быть расположены случайным образом, LinkedHashMap поддерживает последовательность вставки или порядок доступа. Это достигается благодаря использованию двусвязного списка, который связывает все элементы карты.

🔹 Структура LinkedHashMap

Основой LinkedHashMap является та же хэш-таблица, что и в HashMap, но с дополнительной структурой двусвязного списка для сохранения порядка элементов:

▪️ Каждая запись (entry) в LinkedHashMap содержит ссылки на предыдущий и следующий элементы. Это позволяет поддерживать порядок добавления или порядок последнего доступа.
▪️ Сначала выполняется хэширование ключей для быстрой вставки и поиска, как в HashMap, а уже потом запись связывается в список.

🔹 Производительность

▪️ Вставка: Добавление новых элементов выполняется за O(1), поскольку элементы добавляются в конец двусвязного списка, а хэш-таблица используется для поиска свободной позиции.
▪️ Удаление: Удаление элемента требует корректировки ссылок в двусвязном списке, что увеличивает накладные расходы, но также выполняется за O(1).
▪️ Поиск: Операция поиска по ключу происходит с использованием хэш-таблицы и выполняется за O(1), как и в HashMap.
▪️ Множественные коллизии: в худшем случае все операции будут выполняться с O(n), если допустить множественные коллизии.

🔹 Использование памяти

Каждая запись LinkedHashMap содержит дополнительные ссылки на предыдущий и следующий элементы, что увеличивает потребление памяти по сравнению с HashMap. Однако это оправдано, если важен порядок элементов.

🔹 Преимущества и недостатки

▪️ Преимущества:

- Сохранение порядка вставки: LinkedHashMap гарантирует, что элементы будут извлекаться в том порядке, в котором они были добавлены.
- Порядок доступа: Можно настроить LinkedHashMap на удаление самых старых элементов, что полезно для кэшей, где используется политика LRU (Least Recently Used).
- Предсказуемость итераций: В отличие от HashMap, где порядок элементов может изменяться, LinkedHashMap всегда сохраняет стабильный порядок.

▪️ Недостатки:

- Более высокое потребление памяти: Дополнительные ссылки на предыдущие и следующие элементы увеличивают память на каждую запись.
- Скорость: LinkedHashMap немного медленнее HashMap из-за поддержания порядка элементов.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍127🔥3