Java библиотека
30.9K subscribers
2.09K photos
84 videos
10 files
2.05K links
Книги, статьи, мемы и многое другое для Java программиста!

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

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

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

Сообщество VK https://vk.com/javatutorial
Download Telegram
👩‍💻 Java: используйте WeakHashMap для кэширования, когда ключи без ссылок должны удаляться сборщиком мусора.

В HashMap, пока существует сама мапа, ключи и связанные с ними значения не будут удаляться сборщиком мусора.

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

Пример:

Map<User, String> map = new WeakHashMap<>();

User u1 = new User("Mick");
map.put(u1, "Cached data");
...
u1 = null;

// С этого момента ключ u1 доступен для сборки мусора.


Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41🔥1
👩‍💻 Java tip: группировка данных в одну строку

Если нужно быстро сгруппировать элементы потока по какому-то признаку — используйте Collectors.groupingBy().

Пример: группируем пользователей по возрасту


Map<Integer, List<User>> byAge =
users.stream()
.collect(Collectors.groupingBy(User::getAge));


Что происходит:

Stream проходит по списку users

groupingBy берёт значение из User::getAge

В результате получаем Map<Возраст, List<User>>

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

• группировка заказов по статусу
• пользователей по ролям
• транзакций по дате
• логов по уровню (INFO / ERROR)

Бонус: можно комбинировать с другими Collectors


Map<Integer, Long> countByAge =
users.stream()
.collect(Collectors.groupingBy(
User::getAge,
Collectors.counting()
));


Минимум кода - максимум читаемости. Подписывайся, больше фишек каждый день!

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍3🔥3
Media is too big
VIEW IN TELEGRAM
Java. Анонимное наследование и блок инициализации.

Разбираем создание и настройку объекта при помощи анонимного наследования и реализации блока инициализации.

🌐🗣СМОТРЕТЬ VKVIDEO

📺🗣СМОТРЕТЬ RUTUBE

🎞🗣СМОТРЕТЬ YOUTUBE

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2🔥2
Forwarded from Java News
Как создать AI‑агента на Java: связка Spring AI + MCP

В статье разбираем: как за пятнадцать минут превратить обычный метод с @McpTool в инструмент для модели, где проходит граница ответственности (решение принимает LLM — действует ваш код) и почему до прода доезжают единицы.

Читать статью


Наш канал в Макс 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2🔥2
Культивация программиста. Становление императором Java. Секта Java Core (2026) PDF

Что, если изучение Java было бы не скучным учебником, а путём культивации? Перед вами необычная книга для тех, кто хочет начать программировать, но устал от сухих объяснений, однотипных примеров и ощущения, что код — это набор непонятных символов. В книге есть не только теория, но и практические испытания, повреждённые свитки с ошибками, турнирные зачёты и финальное задание — собрать собственную систему секты. Эта книга подойдёт абсолютным новичкам, фанатам аниме, ранобэ, дунхуа и всем, кто хочет изучать Java через историю, юмор и понятные метафоры.
1👍832🎅2🔥1
Media is too big
VIEW IN TELEGRAM
Security со Spring Boot 3.1 | Авторизация и Аутентификация

В этом видео мы разберемся, как выполнить аутентификацию и авторизацию с помощью spring boot 3.1 и spring security 6

🌐🗣СМОТРЕТЬ VKVIDEO

📺🗣СМОТРЕТЬ RUTUBE

🎞🗣СМОТРЕТЬ YOUTUBE

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥21
Forwarded from Java Guru 🤓
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥31
👩‍💻 Магия IntelliJ IDEA

Если используешь Ctrl + P (подсказка параметров метода), то вот ещё один полезный хот кей: Shift + Ctrl + I → быстрый просмотр определения.

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

— Позволяет посмотреть реализацию метода/класса/интерфейса без перехода в другой файл.
— Работает с любыми символами: методами, переменными, константами, даже SQL-мэпперами в MyBatis.
— Незаменимо, если не хочешь терять контекст текущего кода.

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

— Наведи курсор на метод, поле или класс, нажми Ctrl + Shift + I — появится всплывающее окно с реализацией.
— Работает и в дебаге, и при просмотре внешних библиотек (если есть исходники).

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍53
75 вопросов и ответов на собеседование по Spring

🌐🗣СМОТРЕТЬ VKVIDEO

📺🗣СМОТРЕТЬ RUTUBE

🎞🗣СМОТРЕТЬ YOUTUBE

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥42👍1
Вопрос с собеседования

Что такое livelock?

Ответ: livelock — тип взаимной блокировки, при котором несколько потоков выполняют бесполезную работу, попадая в зацикленность при попытке получения каких-либо ресурсов.

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


Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82🔥2
Совет по Java Spring Boot

Если в JSON-запросе приходят лишние поля, приложение может упасть с ошибкой
UnrecognizedPropertyException.

Чтобы этого избежать и не ломать API, добавь аннотацию:

@JsonIgnoreProperties(ignoreUnknown = true)
public class UserDTO {
private String name;
private int age;
}


Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍53
👩‍💻 Java совет: избегай глубоких if-else - используй guard clauses

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

Плохо: вложенные if-else
- сложно читать
- логика размазана
- любая правка превращается в боль

Хорошо: guard clauses (ранние выходы)
- проверки сразу отсекают невалидные состояния
- основной сценарий читается сверху вниз
- код короче и понятнее

Почему guard clauses — это профессиональный подход:
- уменьшают когнитивную нагрузку
- делают бизнес-логику очевидной
- упрощают рефакторинг и тестирование
- отлично сочетаются с fail-fast философией

Правило простое:
если условие — это ошибка или исключение из нормального потока,
проверь его сразу и выйди из метода.

Так код становится:
- линейным
- предсказуемым
- удобным для поддержки

Мелочь на уровне синтаксиса, но огромная разница на уровне качества кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥31💯1
Forwarded from Java Guru 🤓
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍31🔥1
Forwarded from Java News
ORM — есть ли профит? Особенно когда по двору бегает ИИ-шка

ORM — Object-Relational Mapping — Объектно-реляционное отображение — это технология, позволяющая связывать SQL-ые БД с ООП кодом. Самая известная из них — Hibernate.
Hibernate — очень красивая технология. Она формирует ощущение магии.
Ты просто создаёшь объект, — хлабысь! — он уже в базе данных. Никакого SQL, никаких соединений, никаких ResultSet. Всё происходит как будто само собой. Прелесть.
Именно поэтому отказаться от Hibernate так тяжело.

Читать статью


Наш канал в Макс 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9💯21🔥1😁1
👩‍💻 Магия IntelliJ IDEA

IntelliJ IDEA может помочь с созданием тестов. С помощью Ctrl + Shift + T можно сгенерировать структуру тестов для классов и методов.

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

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

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

— Поместите курсор на класс или метод, для которого нужен тест.
— Нажмите Ctrl + Shift + T (на Windows/Linux) или Cmd + Shift + T (на macOS).
— Выберите, какой тестовый фреймворк использовать (JUnit, TestNG и т.д.), и IDEA предложит создать тестовый класс с нужной структурой.

IDE автоматически создаст тестовый класс с методами для проверки каждого (или выбранного) публичного метода.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥42
Вопрос с собеседования

Что такое брокер сообщений и какие из них обычно используются в проектах на Java?

Ответ: Брокер сообщений — это система, которая принимает, хранит и пересылает сообщения между различными компонентами приложения, обеспечивая асинхронное и устойчивое взаимодействие. Это позволяет сервисам быть слабо связанными и работать независимо.

В Java-проектах наиболее часто используют Apache Kafka — для высоконагруженной потоковой обработки, RabbitMQ — для гибкой очередности и маршрутизации сообщений, и ActiveMQ — как решение, тесно интегрированное с экосистемой Java (например, через JMS API).


Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73🔥1
🔴 Завтра тестовое собеседование с Java-разработчиком

1 июля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
📂 Виктор Анохин, старший разработчик из WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Виктор будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Виктору

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

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

Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2🔥2
Java Generics — всё, что нужно знать

1. Box<T> → Обобщённый класс
• Используй, когда класс работает с любым типом (например, обёртка вокруг любого объекта, как Box<User>, Box<Integer>).

2. <T> void print(T val) → Обобщённый метод
• Используй, когда метод должен принимать любой тип (например, для печати любого объекта, логирования, сравнения и т.п.).

3. <T extends Number> → Ограниченный тип
• Называется верхней границей.
• Используй, когда тип должен быть подклассом чего-то (например, утилита для работы с int, double, float).

4. <T extends A & B> → Несколько ограничений
• Заставляет T реализовывать и A, и B.
• Используй, когда нужны обе особенности (например, сортировка объекта, который также требует валидации).

5. <?> → Неограниченный подстановочный тип
• Это означает неизвестный тип.
• Используй, когда не важен тип, нужно только читать (например, печать элементов из любого списка).

6. <? extends T> → Верхняя граница подстановочного типа
• Означает некоторый подкласс T.
• Используй при чтении из коллекции (например, чтение чисел из List<? extends Number> без модификации).

7. <? super T> → Нижняя граница подстановочного типа
• Означает некоторый суперкласс T.
• Используй при записи в коллекцию (например, добавление Integer в List<? super Integer>).

8. Правило PECS
• Producer Extends, Consumer Super.
• Используй extends для чтения, super для записи (например, API-вход против обработки ответа).

9. List list = new ArrayList(); → Сырой тип
• Это сырой тип.
• Избегай — тк теряется типовая безопасность (например, компилятор не поймает, если добавишь неверные типы).

10. Стирание типов
• Java удаляет всю информацию об обобщениях во время выполнения.
• Поэтому нельзя использовать T.class, new T(), или instanceof T (например, нельзя делать проверки или создавать объекты на основе T).

11. Обобщённый конструктор
<T> MyClass(T val) { }

• Используй, когда конструктору нужен обобщённый параметр, даже если сам класс не обобщённый (например, инициализация с динамическими типами).

12. Обобщённый интерфейс
interface Mapper<F, T> { T map(F input); }

• Используй при преобразовании одного типа в другой (например, DTO → сущность).

13. Нельзя использовать примитивы
• Нельзя List<int> — только List<Integer>.
• Используй обёртки (коллекции могут хранить только объекты, не примитивы).

14. Нельзя создавать массивы с обобщением
new T[] не работает.
• Используй List<T> вместо (например, динамические коллекции).

15. Нельзя использовать подстановочные типы для вставки
• Нельзя вставлять в List<? extends Number>.
• Используй <? super Number>, если нужна вставка (например, для пакетной обработки или модификации коллекции).

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
16👍9🔥5
👩‍💻 Java: используйте ReentrantReadWriteLock, когда чтений намного больше, чем записей

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

В таких случаях лучше использовать ReentrantReadWriteLock из java.util.concurrent.

Идея простая:

- Read Lock — позволяет нескольким потокам читать данные одновременно
- Write Lock — разрешает запись только одному потоку и блокирует всех остальных

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

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

- данные читаются очень часто
- записи происходят редко
- важно максимально увеличить throughput системы

Примеры использования:
кэш в сервисе, конфигурации, метаданные, in-memory storage, state менеджеры.


import java.util.concurrent.locks.ReentrantReadWriteLock;

public class SharedValue {

private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private int value = 0;

public int readValue() {
lock.readLock().lock();
try {
return value;
} finally {
lock.readLock().unlock();
}
}

public void writeValue(int newValue) {
lock.writeLock().lock();
try {
value = newValue;
} finally {
lock.writeLock().unlock();
}
}
}


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

Но как только начинается запись - все чтения и записи блокируются, пока операция не завершится.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥144❤‍🔥2👍2
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍3🔥1
Вопрос с собеседования

Что такое String Pool в Java и как он работает?

Ответ: String Pool — это специальная область в памяти, где хранятся строковые литералы. Когда создается строка с помощью литерала (например, String s = "Hello";), JVM проверяет, существует ли уже такая строка в пуле. Если строка с таким значением уже есть, используется существующая строка, иначе создается новая строка и добавляется в пул. Это позволяет экономить память, так как одинаковые строковые литералы будут ссылаться на один и тот же объект в пуле.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥42