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

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

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

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

Сообщество VK https://vk.com/javatutorial
Download Telegram
🖥 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
🔒 Pessimistic vs Optimistic Locking

🟡Pessimistic Locking

- Запись недоступна для других потоков до тех пор, пока текущий поток не закончит работу с ней.
- Даже чтение данных другими потоками невозможно, пока лок не снят.
- Пример: EntityManager.lock(entity, LockModeType.PESSIMISTIC_WRITE) в JPA.
- Минусы: снижает производительность при высоком уровне конкурентного доступа.
- Когда применять: при критической необходимости точности данных.

🟡Optimistic Locking

- Не блокирует данные при чтении, но проверяет версию записи при сохранении.
- Пример: аннотация @Version в JPA (колонка для хранения версии).
- Если версия изменена другим потоком, выбрасывается OptimisticLockException.
- Минусы: требует обработки конфликтов.
- Когда применять: при большом количестве чтений и низкой вероятности конфликтов.

Какой подход вы чаще используете в своих проектах?

@javalib #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍193🔥3
Секреты в Java-сервисах на Spring: где брать и как обновлять

Меня зовут Андрей Чернов, я Java‑архитектор в СберТехе, где разрабатываю архитектуру микросервисов. Сейчас я расскажу про нюансы работы с секретами в Java‑сервисах на всеми любимом Spring Boot и про наш опыт такой работы. В современном мире практически не осталось автономных, ни с чем не интегрированных, сервисов. А секреты в первую очередь нужны для безопасных интеграций.

Статья будет состоять из двух частей. В первой расскажу про особенности работы с секретами в Java на Spring Boot — где их брать и как применять к вашему сервису на примере того, как мы делаем это в Platform V Sessions Data (распределенный in‑memory кеш для клиентских сессий, который позволяет снизить нагрузку на внешние сервисы и базу данных). Также расскажу про стандартные варианты обновления секретов «на горячую» (не останавливая, не перезапуская сервисы, и даже не снимая с них нагрузку) и что с ними не так.

Во второй части подробно разберу, как мы обновляем секреты «на горячую». Эти советы помогут вам улучшить работу с секретами, а значит сделать сервисы более защищёнными. Ведь если секреты попадут в руки злоумышленников, те смогут атаковать ваш сервис — вывести его из строя, украсть конфиденциальные данные и т. п. А любая успешная атака чревата для компаний потерей денег, нервов, времени и репутации.


Читать статью
👍113🔥3😁1
Forwarded from Java Guru 🤓
Что будет результатом кода?
👍7🔥4
Hot reload секретов под нагрузкой в Java-сервисах на Spring

Привет! На связи Андрей Чернов, Java‑архитектор в СберТехе. В прошлой своей статье я рассказал про особенности работы с секретами в Java‑сервисах на Spring Boot — где их брать и как применять к вашему сервису, на примере того, как мы делаем это в Platform V Sessions Data.

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

Как я уже говорил, файлы с секретами по разным причинам меняются, поэтому сервису нужно вовремя реагировать на это и применять новые секреты. В своём сервисе Platform V Sessions Data мы решили применять обновления секретов прямо «на горячую», не останавливая, не перезапуская сервисы, и даже не снимая с них нагрузку. Мы называем это hot reload.


Читать статью
👍53🔥3
📎Паттерн Фасад (Facade)

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

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

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

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

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

Недостатки:

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

📌 Паттерн Фасад полезен, когда нужно объединить несколько подсистем под один общий интерфейс, делая систему более удобной и простой для использования. Например, при работе с библиотеками, требующими сложной настройки, или в крупных проектах, где взаимодействие с множеством компонентов может стать запутанным. Фасад помогает улучшить архитектуру и повысить удобство работы с системой.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍156🔥3
🖥Resilience4j — это библиотека для Java, которая предоставляет шаблоны устойчивости, такие как ограничение количества запросов, цепочка перезапусков, схема "предохранитель" (Circuit Breaker), отказоустойчивость и тайм-ауты. Она разработана для повышения стабильности и надежности микросервисов и других распределенных систем, помогая справляться с ошибками и сбоями в вызовах внешних сервисов.

🔍 Основные компоненты Resilience4j:

🌟 Circuit Breaker — схема, которая отслеживает ошибки в зависимости от их частоты и может временно блокировать вызовы к нестабильному сервису.

🌟 Rate Limiter — компонент для контроля частоты запросов и предотвращения перегрузки систем.

🌟 Retry — механизм для повторных вызовов при временных ошибках, позволяющий задать количество попыток и интервалы.

🌟 Bulkhead — ограничение параллельных потоков или разрешенных вызовов для защиты от перегрузки ресурсов.

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

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

🖥 Github

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥74😁1
Собеседование на Senior Java разработчика

Провожу собеседование на Senior Java разработчика, разбираем вопросы и ответы. В видео узнаете, что ждут от кандидатов на этом уровне.

📺🗣СМОТРЕТЬ RUTUBE

🌐🗣СМОТРЕТЬ VKVIDEO

📝🗣СМОТРЕТЬ DZEN

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🔥2😁1
🔼 Roadmap от джуна до сеньора

🟡Инструменты для работы в команде: Освойте Jira, Confluence, Slack, MS Teams, Zoom и другие.
🟡Языки программирования: Углубитесь в 1-2 языка, например, Python, С#.
🟡Разработка API: Изучите REST, GraphQL, gRPC.
🟡Серверы и хостинг: Ознакомьтесь с AWS, Azure, GCP, Kubernetes.
🟡Аутентификация и тестирование: Освойте JWT, OAuth2, TDD и нагрузочное тестирование.
🟡Базы данных: Работайте с SQL (Postgres, MySQL) и NoSQL (MongoDB).
🟡CI/CD: Изучите GitHub Actions, Jenkins.
🟡Алгоритмы: Разберитесь в Big O, деревьях, графах.
🟡Системный дизайн: Погрузитесь в кэширование, микросервисы, балансировку нагрузки.
🟡Паттерны проектирования: Изучите DI, фабрику и другие паттерны.
🟡AI-инструменты: Научитесь использовать GitHub Copilot, ChatGPT.

Какие пункты вы бы ещё добавили?

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍236🔥4🎅2
Spring Reactor. Эволюция сервисов. На пути к реактивности

Это статья описывает опыт миграции традиционного приложения java spring на Spring reactor стек. О специфике разрабатываемой информационной системы, уже подробно рассказывал. Кратко о системе - смешанная сервисно-микросервисная архитектура. Чтобы получить бизнес результат, требуется вызвать микросервис, который вызывает сервис, который вызывает набор микросервисов для формирования ценностного набора данных. Получается цепочка вызовов. Сервисы и микросервисы разрабатывались на традиционном технологическом стеке, без использования реактивного подхода.

Читать статью
👍92🔥2
В чем основные различия между checked и unchecked исключениями?

Проверяемые исключения (Checked Exceptions) требуют обработки во время компиляции. Это исключения, которые происходят из класса Exception, но не являются подклассами RuntimeException. Нужно либо обрабатывать такие исключения с помощью try-catch, либо объявлять их в сигнатуре метода с ключевым словом throws. Их цель — предупредить ошибки, которые могут быть предсказаны, но неизбежны, например, проблемы с доступом к файлам.

Непроверяемые исключения (Unchecked Exceptions) включают в себя RuntimeException и его подклассы, такие как NullPointerException, IndexOutOfBoundsException и IllegalArgumentException. Эти исключения происходят во время выполнения и сигнализируют о логических ошибках в коде, которые обычно можно избежать, если правильно построить логику программы. Обработка таких исключений — выбор разработчика, поскольку они не проверяются компилятором и, как правило, возникают из-за ошибок программиста, которые не связаны с внешними условиями.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥64
Forwarded from Java Guru 🤓
Что будет результатом кода?
👍6🔥3
Forwarded from Java Guru 🤓
👍9🔥3
📞 kkTerminal — веб-терминал на Vue.js и Java для удаленного подключения к серверам через SSH! Это инструмент, который можно использовать через браузер, с поддержкой таких возможностей, как:

🌟 Подключение по SSH: Пользователи могут устанавливать соединение с удалёнными серверами, настраивая параметры прямо в интерфейсе.

🌟 Интеграция на веб-сайтах: Подключение возможно через использование тега <iframe> на сторонних веб-страницах.

🌟 Поддержка Docker: Приложение легко разворачивается через Docker-образ, предоставленный автором.

🌟 Управление файлами: Есть функционал просмотра, загрузки, редактирования и управления файлами и папками на удалённом сервере.

🌟 Настройка интерфейса: Можно менять фон, шрифты, размер текста и другие визуальные настройки терминала.

🌟 Работа с горячими клавишами: Поддерживаются операции с файлами с использованием сочетаний клавиш.

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

🖥 Github

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍105🔥31
Никогда не используй CascadeType.ALL вместе с @ManyToMany | Amplicode

Использовать CascadeType.ALL для @ManyToMany не рекомендуется, так как это может привести к непредсказуемым результатам во время удаления JPA сущностей. Вместо этого следует использовать CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST и CascadeType.REFRESH.

🌐🗣СМОТРЕТЬ VKVIDEO

📺🗣СМОТРЕТЬ RUTUBE

📝🗣СМОТРЕТЬ DZEN
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍65
Как работает CopyOnWriteArrayList под капотом?

CopyOnWriteArrayList — это потокобезопасная реализация списка, оптимизированная для сценариев с частым чтением и редкими изменениями. Когда происходит изменение в CopyOnWriteArrayList, создаётся новая копия базового массива, в которую вносятся изменения. Таким образом, чтение и запись изолированы: до завершения модификации читающие потоки получают доступ к старому массиву, а запись завершает свою работу, не блокируя других потоков.

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

🟡 До завершения операции модификации все читающие потоки продолжают работать с текущей неизменяемой версией массива.
🟡 При вызове методов, изменяющих список (например, add, remove), создаётся новый массив на основе старого. Изменения применяются именно к новому массиву.
🟡 После завершения модификации ссылка на массив обновляется на новую версию. Теперь все новые операции чтения будут работать с обновлённой версией.

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

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

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

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

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