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

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

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

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

Сообщество VK https://vk.com/javatutorial
Download Telegram
Путеводитель по техническим транзакциям с Camunda 8 и Spring

Интересно, как работают технические транзакции с Camunda и фреймворком Spring? Узнайте больше о транзакционном поведении в этом блоге.

Мы регулярно отвечаем на вопросы о том, как работают технические транзакции при использовании Camunda (в последней версии 8.x) и фреймворка Spring. Например, что происходит, если у вас есть две сервисные задачи, и второй вызов завершается с ошибкой? В этом блоге я опишу типичные сценарии, чтобы сделать поведение более наглядным. Я буду использовать примеры кода на Java 17, Camunda 8.3, Spring Zeebe 8.3, Spring Boot 2.7 и Spring Framework 5.3.


Читать статью
👍94
🤣
😁1094👍3
CI/CD Pipeline

CI/CD пайплайн — это система, которая позволяет автоматизировать ключевые этапы разработки: от сборки и тестирования до развертывания программного обеспечения. Такой подход объединяет все стадии жизненного цикла проекта — написание кода, его проверку, тестирование и публикацию — в единый поток, где каждый шаг выполняется автоматически и последовательно.

На диаграмме выше представлены инструменты, которые часто используются для создания эффективного CI/CD пайплайна.

Вы применяете какие-то из них в своих проектах?

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉14👍52🔥2
🖥 Генерация классов Java из схем Avro с использованием Gradle!

💡 В этом уроке вы научитесь генерировать Java-классы из схемы Apache Avro. Сначала вы познакомитесь с двумя методами: использованием существующего плагина Gradle и созданием кастомного задания для скрипта сборки. Затем рассмотрите плюсы и минусы каждого подхода и поймете, в каких случаях каждый из них лучше всего применять!

🔗 Ссылка: *клик*

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍134🔥4
Forwarded from Java Guru 🤓
Что будет выведено для запроса /api/hello?name=Spring
👍6🔥4
Forwarded from Java Guru 🤓
Что будет выведено для запроса /api/hello?name=Spring
Anonymous Quiz
3%
Hello, name
16%
Hello, World
69%
Hello, Spring
11%
400 Bad Request
😁15👍5🔥4🍾1
🖥 quarkus-langchain4j — расширение для Quarkus, которое упрощает интеграцию с библиотекой LangChain4j и позволяет использовать модели больших языковых моделей (LLMs) в приложениях на Quarkus!

🌟 Расширение поддерживает работу с различными LLM-провайдерами (такими как OpenAI и Hugging Face), кэширование, интеграцию с хранилищами документов (Redis, Chroma) и обеспечивает совместимость с нативной компиляцией.

🔐 Лицензия: Apache-2.0

🖥 Github

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥63👍3
❗️ Что такое нормализация базы данных, и какие существуют нормальные формы?

Нормализация — это процесс приведения структуры базы данных к оптимальному виду для устранения избыточности данных и обеспечения их целостности. Процесс состоит из последовательных этапов, соответствующих нормальным формам (НФ).

Основные нормальные формы (НФ):

1️⃣ Первая нормальная форма (1НФ):
Данные делятся на атомарные (неделимые) значения.
Пример: В одной ячейке таблицы не может быть списка телефонов, вместо этого создается отдельная строка для каждого телефона.

2️⃣ Вторая нормальная форма (2НФ):
Требует выполнения 1НФ и исключения зависимости от части составного первичного ключа. Это устраняет проблему дублирования данных.
Пример: Если таблица использует составной ключ (например, "Курс" и "Студент"), информация, относящаяся только к "Курсу", выносится в отдельную таблицу.

3️⃣ Третья нормальная форма (3НФ):
Выполняется 2НФ и устраняются транзитивные зависимости — неключевые атрибуты должны зависеть только от ключа.
Пример: Если в таблице есть "ID сотрудника", "Отдел" и "Название отдела", то "Название отдела" переносится в отдельную таблицу "Отделы".

Редко используемые нормальные формы:

- Нормальная форма Бойса-Кодда (BCNF): Уточнённая версия 3НФ, где каждое определяющее множество является суперключом. Используется для устранения более сложных аномалий.
- Четвёртая нормальная форма (4НФ): Устраняет многозначные зависимости, которые появляются при использовании нескольких связей между одними и теми же атрибутами.
- Пятая нормальная форма (5НФ): Делает базу данных устойчивой к разделению данных, устраняя зависимости соединений.

Эти формы применяются в сложных сценариях, например, при проектировании корпоративных систем с огромным количеством взаимосвязей. Для большинства приложений 3НФ оказывается достаточной.

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥96
🖥 Opik — это открытая платформа для разработки, тестирования и мониторинга приложений на основе больших языковых моделей (LLM)!

🌟 Этот инструмент помогает отслеживать и анализировать работу LLM, автоматизировать оценку, хранить тестовые случаи и поддерживает интеграцию с CI/CD для упрощения цикла разработки и развертывания. Платформа позволяет как локальный запуск, так и использование в облаке, поддерживает такие фреймворки, как OpenAI, LangChain и другие.

🔐 Лицензия: Apache-2.0

🖥 Github

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍53
Spring Framework и Spring Boot с нуля! 🚀 (12 часов)

Это видео поможет вам с нуля освоить Spring Framework и Spring Boot. В нем вы:
Познакомитесь с основными инструментами.
Разберетесь в принципах работы Spring Framework изнутри.
Научитесь создавать полноценное приложение, используя всё, о чем говорится в видео.
Если вы никогда не работали со Spring Framework или переходите с другого языка программирования на Java, это видео станет отличным стартом для изучения этого фреймворка и начала работы над собственными проектами!


🌐🗣СМОТРЕТЬ VKVIDEO

📝🗣СМОТРЕТЬ DZEN

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥63
❗️Как работает ConcurrentHashMap под капотом?

ConcurrentHashMap – это высокопроизводительная реализация Map, специально разработанная для многопоточной среды. Она гарантирует безопасность данных при одновременном доступе и минимизирует использование блокировок.

💡 Основные механизмы:

🟡 Сегментация данных (до 8 java): Данные разделялись на сегменты, и блокировка происходила на уровне сегмента, а не всей карты. Это обеспечивало параллельный доступ к разным частям карты.

🟡 Кассовые таблицы (Java 8+): Вместо сегментов используется структура на основе Node[] – массив узлов. Это сделало структуру более гибкой. Вместо сегментации применяется механизм Fine-Grained Locking и Compare-And-Swap:
- Compare-And-Swap используется для операций записи, что позволяет избегать блокировок для большинства операций. Операции с разными бакетами могут выполняться параллельно, поскольку локальная блокировка применяется только к отдельному узлу или бакету.
- Fine-Grained Locking минимизирует область блокировок. Например, если требуется масштабирование (resize) или обработка коллизий, потоки могут продолжать работу с другими бакетами, даже если один из них временно заблокирован.
- synchronized применяется только для случаев, когда CAS не справляется (например, при реорганизации данных или сложных операциях). Это помогает поддерживать баланс между безопасностью и производительностью.

🟡 Масштабируемый массив (Resizable Array): Масштабирование в ConcurrentHashMap происходит градуально, чтобы избежать блокировки всей структуры. Новый массив создаётся с увеличенным размером, и данные переносятся постепенно, по частям. Во время переноса используется специальный узел ForwardingNode, который перенаправляет операции к новому массиву, обеспечивая корректную работу всех потоков.

📚 Основные методы:

🔘 get(Object key):
Легковесная операция, не требует блокировок. Ключ хэшируется, затем вычисляется индекс сегмента. Если в сегменте есть соответствующий узел, он возвращается.

🔘 put(K key, V value):
- Сначала используется CAS для вставки нового элемента.
- Если CAS не срабатывает (например, при наличии коллизии), включается локальная блокировка на соответствующей корзине.

🔘computeIfAbsent/compute:
Более сложные операции, которые комбинируют вычисления с модификацией. Используются короткие локи для минимизации блокировки других потоков.

⚠️ Особенности:

- ConcurrentHashMap не допускает хранения null для ключей и значений. Это связано с невозможностью различать отсутствие значения и реальное хранение null.
- Итерации по карте предоставляют "слабо согласованные" данные, что означает, что изменения, происходящие параллельно, могут быть частично видны.

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

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥83😁1
🖥 perfio — высокопроизводительные буферизированные инструменты ввода-вывода для JVM, оптимизированные для потоковой обработки бинарных и текстовых данных!

🌟 Эти инструменты значительно быстрее стандартных библиотек благодаря упрощенной архитектуре буферов и отказу от многослойного наследования. perfio поддерживает эффективную обработку строк и чисел с оптимизированным использованием памяти и минимизацией накладных расходов на синхронизацию.

🔐 Лицензия: Apache-2.0

🖥 Github

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍124🔥4
Media is too big
VIEW IN TELEGRAM
Знакомство с Resilience4j. CircuitBreaker

В этом видео знакомимся с компонентом библиотеки Resilience4j - CircuitBreaker

📺🗣СМОТРЕТЬ RUTUBE

🌐🗣СМОТРЕТЬ VKVIDEO

📝🗣СМОТРЕТЬ DZEN

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🎉4🔥3
Совет 👩‍💻 Spring Retry

Spring Retry предлагает возможность автоматического повторного выполнения неудачной операции. 🔥



@Configuration
@EnableRetry
public class Application {

}

@Service
class Service {
@Retryable(retryFor = RemoteAccessException.class)
public void service() {
// ... do something
}
@Recover
public void recover(RemoteAccessException e) {
// ... panic
}
}


🖥 Github

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29🔥2
Media is too big
VIEW IN TELEGRAM
Spring Boot ПОЛНЫЙ курс для начинающих [2025]

В этом видео вы получите полный курс по Spring Boot для начинающих. Мы подробно разберем, что такое Spring, как он работает и почему является одним из самых популярных фреймворков для разработки на Java. Вы узнаете, как начать свой путь в программировании с помощью Spring Boot, а также я поделюсь лучшими практиками и советами, которые помогут вам стать уверенным разработчиком и освоить современные инструменты Java-разработки. Досмотрите видео до конца, чтобы получить полное представление о том, как работает Spring Boot и с чего начать свой путь в мире Java-разработки.

📺🗣СМОТРЕТЬ RUTUBE

🌐🗣СМОТРЕТЬ VKVIDEO

📝🗣СМОТРЕТЬ DZEN

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥52
Forwarded from Java Guru 🤓
👇Паттерн Строитель (Builder)

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

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

🟡 Когда нужно создать объект с большим количеством параметров, и не все из них обязательны.
🟡 Когда процесс создания объекта требует выполнения нескольких шагов или дополнительных проверок.
🟡 В случаях, когда один и тот же код должен создавать разные представления объекта (например, текстовое и графическое).

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

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

Недостатки:

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

📌 Паттерн Builder полезен, если объект имеет много параметров и их нужно задавать гибко. Например, при создании сложных конфигураций для HTTP-запросов (заголовки, тело, параметры), построении графических интерфейсов или генерации HTML-документов. Builder помогает сделать код более понятным и избежать создания конструкций с длинными и неудобными конструкторами.

@javatasks #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2110🔥6
🖥 better-inputs — инструмент для расширенной работы с пользовательским вводом в Java, делая этот процесс более гибким и удобным. Он поддерживает настройки типа ввода, ввод через консоль и графический интерфейс, а также функции для проверки корректности введённых данных.

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

🔐 Лицензия: MIT

🖥 Github

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
💡 Глубокий взгляд на реализацию Arrays.sort()

А вы задумывались, что скрывается под капотом Arrays.sort()? Быстрая сортировка? Пузырёк? Или, может, что-то ещё?

На самом деле, Arrays.sort() – это больше, чем просто сортировка. Этот метод использует адаптивные алгоритмы и оптимизации, которые подстраиваются под тип данных и размер массива. А главное – в его реализации предусмотрена защита от худших случаев, таких как неудачное распределение данных, чтобы всегда обеспечивать стабильную производительность.

1️⃣ Примитивы: Dual-Pivot Quicksort

Для массивов примитивных типов (int, double и т.д.) используется Dual-Pivot Quicksort. Он выбирает два опорных элемента, которые делят массив на три части: элементы меньше первого опорного, между опорными и больше второго, с последующей рекурсивной сортировкой каждой части.

🔍 Как это выглядит:

if (arr[left] > arr[right]) {
swap(arr, left, right);
}
int pivot1 = arr[left];
int pivot2 = arr[right];

int i = left + 1, lt = left + 1, gt = right - 1;
while (i <= gt) {
if (arr[i] < pivot1) {
swap(arr, i++, lt++); // Элементы меньше первого опорного
} else if (arr[i] > pivot2) {
swap(arr, i, gt--); // Элементы больше второго опорного
} else {
i++; // Элементы между опорными
}
}
swap(arr, left, --lt);
swap(arr, right, ++gt);


📌 Почему это эффективно?

- Использование двух опорных элементов снижает глубину рекурсии.
- Разбиение на три части позволяет сбалансировать массив быстрее, чем в классическом Quicksort.
- Работает in-place, избегая лишних выделений.
- Даже на отсортированных или случайных данных Dual-Pivot Quicksort показывает стабильную производительность.

2️⃣ Ссылочные типы: Timsort

Если вы сортируете объекты (String, Integer и т.д.), то под капотом работает Timsort – гибридный алгоритм, который сочетает Merge Sort и Insertion Sort. Он адаптивно обрабатывает массивы, находя уже отсортированные последовательности (run'ы) и минимизируя количество операций для их слияния.

🔍 Как это выглядит:

int runLen = 32; // Минимальная длина run
for (int i = 0; i < array.length; i += runLen) {
insertionSort(array, i, Math.min((i + runLen - 1), array.length - 1));
}

while (stackSize > 1) {
if (runLen[stackSize - 2] <= runLen[stackSize - 1]) {
mergeRun(stackSize - 2, stackSize - 1); // Слияние соседних run'ов
}
}


📌 Почему это эффективно?

- Timsort автоматически находит уже отсортированные подмассивы, уменьшая объём работы.
- Работает с заранее выделенными буферами для быстрого слияния подмассивов.
- Сохраняет порядок равных элементов, что важно для многих задач.
- Производительность близка к O(n) на частично отсортированных данных.

3️⃣ Небольшие массивы: Insertion Sort

Для массивов с небольшим количеством элементов (до 32) используется Insertion Sort (сортировка вставками). Он работает, проходя по массиву и вставляя каждый элемент на своё место в уже отсортированной части, сдвигая элементы, которые больше текущего, вправо. Этот алгоритм применяется, так как на малых объёмах данных он оказывается быстрее более сложных методов благодаря низким накладным расходам и простоте реализации.

🔍 Как это выглядит:

for (int i = left + 1; i <= right; i++) {
int key = array[i];
int j = i - 1;
while (j >= left && array[j] > key) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = key;
}


📌 Почему это эффективно?

- Алгоритм не требует дополнительной памяти и выполняется in-place.
- Сложность O(n^2) на больших данных компенсируется эффективностью на длине до 32 элементов.
- Использует уже загруженные данные в кэше процессора, что ускоряет доступ к памяти.

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥103😁1
Реальный кейс: 22 вопроса на техническом интервью на вакансию Java Lead в JP Morgan в 2025 году

Многим разработчикам наверняка интересно, какие вопросы задают на техинтервью в мультинациональных корпорациях. Ведь ИТ-индустрия была и остается глобальной, несмотря на геополитику и разные другие сложности. Как минимум, такая информация об интервью «из первых рук» — это ориентир по уровню сложности собеседования на позицию Java Lead в любых других компаниях, включая крупные российские банковские и промышленные структуры. Именно поэтому эта статья в нашем блоге SSP SOFT.

Читать статью
🔥9👍62😁1
🖥 Apktool — это инструмент на Java для обратного проектирования сторонних, закрытых, бинарных приложений Android!

🌟 Он может декодировать ресурсы в почти исходную форму и восстанавливать их после внесения некоторых изменений; он позволяет отлаживать smali-код шаг за шагом. Он также упрощает работу с приложениями благодаря проектной файловой структуре и автоматизации некоторых повторяющихся задач, таких как сборка .apk и т. д.

🔐 Лицензия: Apache-2.0

🖥 Github

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93🔥3
Развертывание безопасных Java-приложений на AWS EKS с GitLab CI/CD, Maven, Trivy и SonarQube

В современном DevOps для эффективного, надежного и последовательного развертывания программного обеспечения важна автоматизация. Весь процесс разработки и выпуска ПО оптимизируется при помощи мощного инструмента GitLab CI/CD. Развернем с ним приложение Java в мультикластере Kubernetes, управляемом на AWS и настраиваемом в eksctl. Рассмотрим процесс от создания кластера Kubernetes до развертывания контейнеризованного приложения Java, попутно интегрируя инструменты DevOps Trivy и SonarQube.

Читать статью
👍82🔥2