Java библиотека – Telegram
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
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 Совет💡: если ты обожаешь Ctrl + C и Ctrl + V, тебе точно понравится и Ctrl + W.

Это как выделение текста с помощью AI 😉

👩‍💻 Ссылка

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍54
Улучшаем работу с Optional

Все используют Optional, но не все знают, как сделать это лучше. Нередко можно встретить такой код:
Optional<User> userOpt = findUserById(id);
if (userOpt.isPresent()) {
User user = userOpt.get();
processUser(user);
}


Такой код не только избыточен, но и может привести к NoSuchElementException, если забыть проверить isPresent(). Поэтому лучше использовать ifPresent(), чтобы оптимизировать код:
findUserById(id).ifPresent(this::processUser);

📌 Какие ещё варианты

— Для выполнения действия, если значение есть (ifPresent()).
— Для подстановки дефолтного значения (orElse() / orElseGet()).
— Для обработки исключений (orElseThrow()).

⚠️ Плохие практики

🔘Использовать Optional в качестве аргументов методов — это ломает читаемость API.
🔘Использовать Optional.get() без проверки — это сводит всю пользу Optional на нет.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7💯2👍1
👩‍💻 IntelliJ IDEA: Analyze Data Flow

Когда код становится сложнее, простого Find Usages уже мало. Хотите понять, откуда пришло значение переменной или куда оно утекает? Для этого есть Analyze Data Flow.

🟢Что делает

— Позволяет проследить поток данных: где переменная инициализируется, как модифицируется и где используется
— Работает не только для переменных, но и для параметров методов, полей и возвращаемых значений
— Может анализировать как «куда идёт», так и «откуда пришло» (Forward/Backward analysis)

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

— Быстро понять, почему метод получает null (и где он берётся)
— Выявить неочевидные зависимости между частями кода
— Ускорить отладку без бесконечного «шагания» по дебаггеру

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

— Выделите переменную или метод
— Analyze → Data Flow to Here / Data Flow from Here
— IDEA визуально покажет дерево зависимостей

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥94
🔍 JSON Crack — бесплатное и открытое приложение для визуализации данных из JSON!

🌟 Приложение преобразует форматы данных, такие как JSON, YAML, XML, CSV, в интерактивные графики и диаграммы, что упрощает их анализ и понимание. Программа поддерживает множество инструментов для форматирования, преобразования, генерации JSON Schema и экспорта визуализаций в изображения.

🖥 Github

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥102
💥 Разрушители мифов

Мне НЕ нужно разбираться с управлением памятью в Java, так как за меня всё делает GC


Garbage Collector (GC) действительно очищает неиспользуемые объекты, которые больше не имеют активных ссылок. Благодаря этому в Java не нужно вручную освобождать память, как в C++.

Несколько предпосылок к исходному тезису:

🟢В других языках, где ручное управление памятью (C, C++), утечки очевидны — если забыл free(), память навсегда потеряна.
🟢В Java GC работает автоматически, поэтому кажется, что он решает все проблемы сам.
🟢"Ну раз GC есть, значит, про память можно не думать!" — типичная ошибка.

GC удаляет только те объекты, которые больше не имеют активных ссылок. Если же объект остаётся доступным, но фактически не используется, он будет занимать память до завершения работы приложения.

🔽 Несколько случаев утечек памяти

1️⃣ Статические коллекции (заполняем, но не чистим)

Если создать static List и постоянно добавлять в него объекты, они никогда не будут удалены GC, потому что статические поля живут весь срок жизни приложения.

public class MemoryLeak {
private static final List<byte[]> cache = new ArrayList<>();

public static void main(String[] args) {
while (true) {
cache.add(new byte[10 * 1024 * 1024]);
System.out.println("Добавили 10MB в кеш. Используемая память: " +
(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024 * 1024) + "MB");
}
}
}


Через пару минут — OutOfMemoryError

2️⃣ Потоковые переменные (ThreadLocal)

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

public class ThreadLocalLeak {
private static final ThreadLocal<byte[]> threadLocalData = new ThreadLocal<>();

public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);

for (int i = 0; i < 10; i++) {
executor.execute(() -> {
threadLocalData.set(new byte[10 * 1024 * 1024]); // 10MB на поток
System.out.println("Память занята потоком!");
});
}

executor.shutdown();
}
}


Поток завершится, а память останется занята, потому что ThreadLocal не очищается автоматически.

3️⃣ Внутренние классы и "утекшие" ссылки

Если анонимный класс или лямбда-ссылка ссылается на внешний объект, она может мешать GC очистить его.

public class InnerClassLeak {
private String data = "Очень важные данные";

public void createAnonymousClass() {
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("Используем: " + data);
}
};
new Thread(task).start();
}
}


task ссылается на data, даже если InnerClassLeak больше не используется → GC не очистит объект.

👎 Миф разрушен. GC не всемогущий и даже с ним придётся изучать, как работать с памятью в Java.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥18👍73
👩‍💻 Java в Kubernetes за 40 минут: как задеплоить приложение в Minikube

Приглашаем на открытый урок.

🗓 27 октября в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса
«Java Developer. Advanced».

Minikube — личный Kubernetes для тестов. Научитесь деплоить Java-приложения — база для DevOps, CI/CD и продакшна.

Что будет на вебинаре:

✔️ Подготовка Java-приложения к деплою (JAR → Docker image).
✔️Установка Minikube и настройка локального кластера.
✔️Написание манифестов: Deployment, Service, ConfigMap.
✔️Запуск приложения и проверка работоспособности.

В результате вебинара вы:
✔️ Сможете самостоятельно задеплоить Java-приложение в Minikube, написать манифесты и лучше понять, как работает Kubernetes «под капотом».

Кому будет интересно:
Java-разработчикам, начинающим осваивать Kubernetes и DevOps-подходы, а также инженерам, выстраивающим локальные CI/CD практики.

🔗 Ссылка на регистрацию: https://vk.cc/cQJjuN

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3🔥2
📊 MQCloud — корпоративный центр управления RocketMQ.

Это единая платформа, которая объединяет управление очередями, мониторинг и алертинг в одном интерфейсе.

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

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

🖥 GitHub

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3🔥3
🔥Приглашаем на бесплатный вебинар курса “Software Architect”: «Способы разделения микросервисов»

Когда: 29 октября, 20:00 (мск)

О вебинаре

Узнайте, как проектировать масштабируемые микросервисные архитектуры. На открытом уроке курса Software Architect разберём, как разделять микросервисы, чтобы упростить разработку и повысить устойчивость систем.

Что узнаете:

- Применение DDD для декомпозиции микросервисов.
- Разделение сервисов по бизнес-функциям и данным.
- Практические кейсы для гибкости архитектуры.

Что освоите:

- Принципы эффективной декомпозиции.
- Методы для масштабируемых архитектур.
- Практические инструменты для проектов.

👉 Регистрируйтесь: https://vk.cc/cQJWcH

Занятие приурочено к старту курса "Software Architect", обучение на котором позволит освоить компетенции архитектора по моделированию и построению отказоустойчивых, масштабируемых информационных систем.

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
2👍2🔥2😁1
Совет по Java 👩‍💻

Чтобы сделать большие и сложные цепочки компараторов более читаемыми, мне нравится присваивать компараторы переменным, имена которых начинаются с "by". Таким образом, вызов sorted() становится меньше и читается почти как естественный язык. Кроме того, вы можете использовать статический импорт.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤‍🔥12🔥21
👩‍💻 final vs finally vs finalize()

Казалось бы, три похожих ключевых слова → final, finally, finalize(). А смысл принципиально разный. Давайте разберёмся.

🟢final

Модификатор, который делает сущность неизменяемой:

🔘final переменная → нельзя переприсвоить.
🔘final метод → нельзя переопределить.
🔘final класс → нельзя наследовать.

Используется для обеспечения immutability и контрактов в коде.

🟢finally

Блок в try-catch, который выполняется всегда (даже если выброшено исключение).

Гарантирует освобождение ресурсов:
try {
FileReader reader = new FileReader("data.txt");
} catch (IOException e) {
e.printStackTrace();
} finally {
System.out.println("Закрываем ресурсы");
}


🟢finalize()

Метод класса Object, вызываемый GC перед удалением объекта. Используется редко, считается устаревшим (deprecated с Java 9, удалён в Java 18).

Минус: непредсказуемое время вызова.

Современная альтернатива: try-with-resources или явная очистка.

💡 Вывод

final → контроль изменяемости.
finally → контроль завершения.
finalize() → контроль очистки (но не используйте).

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍74🔥2
👩‍💻 Внутреннее устройство LinkedList

LinkedList — это классическая реализация двусвязного списка. На поверхности он выглядит как обычная коллекция, реализующая интерфейсы List, Deque и Queue. Но под капотом это структура узлов (Node), которые связаны друг с другом через ссылки на предыдущий и следующий элемент.

📦 Базовая структура


Каждый элемент списка хранится в отдельном объекте Node<E>, который содержит:

🔘E item — сам элемент
🔘Node<E> next — ссылка на следующий узел
🔘Node<E> prev — ссылка на предыдущий узел

У LinkedList есть два поля:

🔘first — голова списка
🔘last — хвост списка

Это позволяет быстро добавлять элементы в начало и конец.

⚡️ Добавление и удаление

— Добавление в начало (addFirst) или конец (addLast) → O(1): меняем ссылки у пары узлов.
— Удаление головы или хвоста также → O(1).
— Вставка или удаление в середине требует сначала дойти до нужного узла → O(n).

🌊 Поиск элемента


— По индексу: список не хранит массив, значит придётся идти по ссылкам.
— Оптимизация: если индекс ближе к голове, обход идёт с first, если к хвосту — с last.
Сложность в среднем — O(n/2), то есть линейная.

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

— Доступ по индексу → O(n).
— Добавление/удаление в начало или конец → O(1).
— Вставка/удаление в середину → O(n).
— Итерация по списку → O(n), но эффективно, так как используется последовательный проход по ссылкам.

⚖️ Важные нюансы

— В отличие от ArrayList, в LinkedList нет операций с массивами и «ресайзинга».
— Но расходует больше памяти: каждый узел хранит не только элемент, но и две ссылки (prev/next).
— Итераторы fail-fast: изменение списка во время обхода бросает ConcurrentModificationException.

🔄 Итераторы и Deque

LinkedList реализует Deque, что делает его удобным для очередей и стеков. Offer, poll, peek работают за O(1). Push/pop превращают список в стек.

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

На практике ArrayList почти всегда быстрее по времени и эффективнее по памяти.
LinkedList может быть полезен только в редких случаях, когда нужны очень частые вставки/удаления в середину коллекции (без итерации по коллекции) и не важен доступ по индексу. В остальных случаях выбирайте ArrayList.

🔗 Документация: OpenJDK — LinkedList source | Официальная JavaDoc (Java 17)

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍125🔥4🎅1
29 октября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью по System Design.

Как это будет:
📂 Дмитрий Дорофеев, TeamLead в американском FitTech Truv Inc, ex-VK, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Дмитрий будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Дмитрию

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot

Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2🔥2
Как устроен кеш в Spring Boot?

Spring Boot упрощает кеширование благодаря аннотациям и встроенной интеграции с разными кеш-провайдерами (EhCache, Caffeine, Redis и др.). Spring использует Spring Cache Abstraction, которая оборачивает кеширующую логику в аннотации:

🔘 @Cacheable — кладёт результат в кеш
🔘 @CachePut — обновляет кеш
🔘 @CacheEvict — удаляет из кеша

За кулисами используется прокси (через Spring AOP или CGLIB), который перехватывает вызовы методов, проверяет кеш и возвращает либо сохранённое значение, либо выполняет метод и кеширует результат.

🔍 Что под капотом

Если вызвать метод с @Cacheable, Spring выполняет несколько шагов:

1. Определяет ключ кеша


🔘 По умолчанию ключ формируется из параметров метода
🔘 Можно задать кастомный ключ через key = "#id"

2. Проверяет кеш-провайдер

🔘 Дефолтный провайдер — ConcurrentHashMap
🔘 Можно подключить Redis, Caffeine, EhCache и т. д.

3. Возвращает данные

🔘 Если значение есть в кеше — сразу отдаётся
🔘 Если нет – вызывается метод и результат сохраняется в кеше

⚠️ Нюансы

— Кеш работает только для Spring-управляемых бинов (если метод вызван внутри того же класса — кеш не сработает)
— Не кешируйте изменяемые объекты, иначе возможны неожиданные побочные эффекты
— Очищайте кеш, если данные меняются (@CacheEvict)

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥43
👩‍💻 SuperTokens Core — компонент с открытым исходным кодом на Java, предназначенный для реализации аутентификации и управления сессиями в веб-приложениях!

🌟 SuperTokens позиционируется как альтернатива таким решениям, как Auth0, Firebase Auth и AWS Cognito, предоставляя разработчикам полный контроль над пользовательскими данными и возможность развертывания на собственных серверах.

🖥 Github

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍32
🖥 Java: задача


public class Mystery {
public static void main(String[] args) {
System.out.println(method(true) + method(false));
}

static String method(boolean flag) {
return flag ? "Yes" : "No";
}

static String method(String val) {
return val.toUpperCase();
}
}


Что выведет программа, пишите в комментариях?

A) YesNo
B) YESNO
C) Ошибка компиляции
D) null

Правильный ответ: A

➡️ Вызов
method(true) и method(false) однозначно указывает на метод method(boolean), оба возвращают строки.
Результат:
"YesNo". Метод method(String) не используется.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍198🔥3
Пост вызывает непреодолимое желание пройти тест по мобильному тестированию 🐞
Заранее предупреждаем и дарим 1 000 бонусов

Пора переключиться с QA-тестов на квиз по мобильной разработке. Посмотрите на привычные вопросы с другого ракурса.

В Академии Selectel выпустили квиз для тестировщиков. Если вы запускаете релизы мобильных приложений, нужно знать базу о популярных крашах.

Пройдите тест и получите промокод на 1 000 бонусов на продукты и услуги Selectel: https://slc.tl/vivco

Реклама. АО "Селектел". erid:2W5zFHC8Q5N
2👍2🔥2
Оптимизация работы с JDBC в высоконагруженных приложениях

Неэффективное использование JDBC может легко стать узким местом и убить производительность. Вот пошаговый разбор, как сделать работу с JDBC быстрее и стабильнее.

1️⃣ Настраиваем connection pool

Используйте HikariCP, Apache DBCP или C3P0 вместо стандартного DriverManager. Это позволит переиспользовать соединения, а не открывать новое на каждый запрос.

2️⃣ Используем подготовленные запросы (PreparedStatement)

Во-первых, это снижает нагрузку на базу за счёт кеширования плана запроса. Во-вторых, убирает SQL-инъекции на уровне JDBC.

3️⃣ Выбираем правильный тип курсора ResultSet

— TYPE_FORWARD_ONLY, если нужно просто пробежать по данным.
— TYPE_SCROLL_INSENSITIVE позволяет скроллить данные, но требует больше памяти.
— TYPE_SCROLL_SENSITIVE редко нужен, но обновляет данные в реальном времени.

4️⃣ Ограничиваем выборку данных (LIMIT / FETCH FIRST)

Не забирайте сразу всю таблицу – старайтесь выбирать только нужные поля и ограничивать количество строк.

5️⃣ Выключаем автокоммиты

По умолчанию, каждый запрос в JDBC – это отдельная транзакция. Включите setAutoCommit(false) и коммитите изменения пачками, чтобы уменьшить нагрузку.

6️⃣ Логируем медленные запросы

Если какие-то SQL-запросы выполняются слишком долго – используйте SLF4J + P6Spy или встроенные средства логирования в пуле соединений, чтобы их отлавливать.

Какие техники считаете самыми полезными?

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍87🔥4
Почему одни системы выдерживают нагрузку и растут годами, а другие «сыпятся» после первой же интеграции?

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

На открытом уроке «Влияние нефункциональных требований на архитектуру» разберём, как собирать НФТ, переводить их в архитектурные решения и аргументировать выбор стейкхолдерам. Поговорим о trade-off’ах, SLA/SLO, масштабируемости и цене качества.

Присоединяйтесь 11 ноября в 20:00 МСК. Урок проходит в преддверии старта курса «System Design».

Регистрируйтесь и проектируйте системы, которые выдерживают реальность: https://vk.cc/cQPZ0J

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3🔥2
🔐 Bouncy Castle — криптографическая библиотека для Java с открытым кодом. Это решение поддерживает широкий спектр алгоритмов — от базовых шифровальных схем до сложных протоколов вроде S/MIME и OpenPGP.

Проект имеет модульную структуру с разделением на core, JCE-провайдер и специализированные модули для работы с сертификатами X.509 и TLS. Библиотека совместима даже с устаревшими версиями Java, включая J2ME, а сборка теперь поддерживает JDK 21.

🖥 GitHub

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43🔥3
Фишка дебага в IntelliJ IDEA: Reset Frame

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

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

1. Запускаем дебаг и доходим до брейкпоинта.
2. Открываем окно Debug.
3. Во вкладке Frames (стек вызовов) выбираем нужный метод.
4. Нажимаем ПКМ → Reset Frame.
5. Код откатится на вход в метод, как будто вы только что в него зашли.

🟢 Когда это полезно

— Ошиблись при анализе и хотите пересмотреть состояние переменных
— Нужно повторно выполнить метод, не перезапуская весь процесс
— Дебажите рекурсию или сложные цепочки вызовов

⚠️ Важно

— Reset Frame не откатывает глобальные изменения (например, изменения в базе или внешних файлах).
— Он работает только в пределах одного метода – не выйдет вернуть выполнение назад на несколько вызовов.

▪️ Как использовать Reset Frame эффективнее

Можно комбинировать его с Evaluate Expression, чтобы перед повторным вызовом метода изменять переменные вручную.

Пользовались Reset Frame раньше или только узнали?

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26👍115😁1
❤️ Приходите на Backend Talks от Яндекс 360
Санкт-Петербург, 13 ноября в 19:00

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

В программе:

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

📌 Укрощение API: процессы и инструменты, которые действительно работают — Никита Ломакин, разработчик в команде Техплатформы.

📌 Как мы закапывали звездолёт: почему важно отстаивать простоту на архревью — Артемий Коцюбенко, разработчик протокольных сервисов Почты.

Команда Яндекс 360 работает с нагрузками >1.000.000+ RPS и создает продукты которыми пользуются 95+ млн человек каждый месяц — Диск, Почта, Телемост, Мессенджер и другие.

🍻А после докладов вас будут ждать афтепати и нетворкинг!

Регистрируйтесь по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2🔥2