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
👍4❤1🔥1
Если нужно быстро сгруппировать элементы потока по какому-то признаку — используйте
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🟪
Разбираем создание и настройку объекта при помощи анонимного наследования и реализации блока инициализации.
Подписывайся на наш канал в 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 — действует ваш код) и почему до прода доезжают единицы.
Читать статью
Наш канал в Макс🟪
В статье разбираем: как за пятнадцать минут превратить обычный метод с @McpTool в инструмент для модели, где проходит граница ответственности (решение принимает LLM — действует ваш код) и почему до прода доезжают единицы.
Читать статью
Наш канал в Макс
Please open Telegram to view this post
VIEW IN TELEGRAM
VK
Как создать AI‑агента на Java: связка Spring AI + MCP
Всем привет, меня зовут Сергей Прощаев, и в этой статье расскажу про то, как Java и Spring за последний год заметно подтянулись в теме, г..
❤2👍2🔥2
Культивация программиста. Становление императором Java. Секта Java Core (2026) PDF
Что, если изучение Java было бы не скучным учебником, а путём культивации? Перед вами необычная книга для тех, кто хочет начать программировать, но устал от сухих объяснений, однотипных примеров и ощущения, что код — это набор непонятных символов. В книге есть не только теория, но и практические испытания, повреждённые свитки с ошибками, турнирные зачёты и финальное задание — собрать собственную систему секты. Эта книга подойдёт абсолютным новичкам, фанатам аниме, ранобэ, дунхуа и всем, кто хочет изучать Java через историю, юмор и понятные метафоры.
Что, если изучение Java было бы не скучным учебником, а путём культивации? Перед вами необычная книга для тех, кто хочет начать программировать, но устал от сухих объяснений, однотипных примеров и ощущения, что код — это набор непонятных символов. В книге есть не только теория, но и практические испытания, повреждённые свитки с ошибками, турнирные зачёты и финальное задание — собрать собственную систему секты. Эта книга подойдёт абсолютным новичкам, фанатам аниме, ранобэ, дунхуа и всем, кто хочет изучать Java через историю, юмор и понятные метафоры.
1👍8❤3☃2🎅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🟪
В этом видео мы разберемся, как выполнить аутентификацию и авторизацию с помощью spring boot 3.1 и spring security 6
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2❤1
Если используешь Ctrl + P (подсказка параметров метода), то вот ещё один полезный хот кей: Shift + Ctrl + I → быстрый просмотр определения.
— Позволяет посмотреть реализацию метода/класса/интерфейса без перехода в другой файл.
— Работает с любыми символами: методами, переменными, константами, даже SQL-мэпперами в MyBatis.
— Незаменимо, если не хочешь терять контекст текущего кода.
— Наведи курсор на метод, поле или класс, нажми Ctrl + Shift + I — появится всплывающее окно с реализацией.
— Работает и в дебаге, и при просмотре внешних библиотек (если есть исходники).
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍5❤3
75 вопросов и ответов на собеседование по Spring
🌐 🗣 СМОТРЕТЬ VKVIDEO
📺 🗣 СМОТРЕТЬ RUTUBE
🎞 🗣 СМОТРЕТЬ YOUTUBE
Подписывайся на наш канал в Max🟪
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4❤2👍1
Что такое
livelock?Ответ:
Реальный пример livelock — когда два человека встречаются в узком коридоре и каждый, пытаясь быть вежливым, отходит в сторону, и так они бесконечно двигаются из стороны в сторону.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2🔥2
Совет по Java Spring Boot
Если в JSON-запросе приходят лишние поля, приложение может упасть с ошибкой
Чтобы этого избежать и не ломать API, добавь аннотацию:
Подписывайся на наш канал в Max🟪
Если в 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👍5❤3
Одна из самых частых проблем в Java-коде глубоко вложенные условия.
Код формально работает, но читать и поддерживать его тяжело.
❌ Плохо: вложенные if-else
- сложно читать
- логика размазана
- любая правка превращается в боль
✅ Хорошо: guard clauses (ранние выходы)
- проверки сразу отсекают невалидные состояния
- основной сценарий читается сверху вниз
- код короче и понятнее
Почему guard clauses — это профессиональный подход:
- уменьшают когнитивную нагрузку
- делают бизнес-логику очевидной
- упрощают рефакторинг и тестирование
- отлично сочетаются с fail-fast философией
Правило простое:
если условие — это ошибка или исключение из нормального потока,
проверь его сразу и выйди из метода.
Так код становится:
- линейным
- предсказуемым
- удобным для поддержки
Мелочь на уровне синтаксиса, но огромная разница на уровне качества кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥3❤1💯1
Forwarded from Java News
ORM — есть ли профит? Особенно когда по двору бегает ИИ-шка
ORM — Object-Relational Mapping — Объектно-реляционное отображение — это технология, позволяющая связывать SQL-ые БД с ООП кодом. Самая известная из них — Hibernate.
Hibernate — очень красивая технология. Она формирует ощущение магии.
Ты просто создаёшь объект, — хлабысь! — он уже в базе данных. Никакого SQL, никаких соединений, никаких ResultSet. Всё происходит как будто само собой. Прелесть.
Именно поэтому отказаться от Hibernate так тяжело.
Читать статью
Наш канал в Макс🟪
ORM — Object-Relational Mapping — Объектно-реляционное отображение — это технология, позволяющая связывать SQL-ые БД с ООП кодом. Самая известная из них — Hibernate.
Hibernate — очень красивая технология. Она формирует ощущение магии.
Ты просто создаёшь объект, — хлабысь! — он уже в базе данных. Никакого SQL, никаких соединений, никаких ResultSet. Всё происходит как будто само собой. Прелесть.
Именно поэтому отказаться от Hibernate так тяжело.
Читать статью
Наш канал в Макс
Please open Telegram to view this post
VIEW IN TELEGRAM
VK
ORM — есть ли профит? Особенно когда по двору бегает ИИ-шка
ORM — Object-Relational Mapping — Объектно-реляционное отображение — это технология, позволяющая связывать SQL-ые БД с ООП кодом. Самая и..
👍9💯2❤1🔥1😁1
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🔥4❤2
Вопрос с собеседования
Что такое брокер сообщений и какие из них обычно используются в проектах на Java?
Ответ:Брокер сообщений — это система, которая принимает, хранит и пересылает сообщения между различными компонентами приложения, обеспечивая асинхронное и устойчивое взаимодействие. Это позволяет сервисам быть слабо связанными и работать независимо.
В Java-проектах наиболее часто используют Apache Kafka — для высоконагруженной потоковой обработки, RabbitMQ — для гибкой очередности и маршрутизации сообщений, и ActiveMQ — как решение, тесно интегрированное с экосистемой Java (например, через JMS API).
Подписывайся на наш канал в Max🟪
Что такое брокер сообщений и какие из них обычно используются в проектах на Java?
Ответ:
В Java-проектах наиболее часто используют Apache Kafka — для высоконагруженной потоковой обработки, RabbitMQ — для гибкой очередности и маршрутизации сообщений, и ActiveMQ — как решение, тесно интегрированное с экосистемой Java (например, через JMS API).
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3🔥1
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<User>, Box<Integer>).
2.
• Используй, когда метод должен принимать любой тип (например, для печати любого объекта, логирования, сравнения и т.п.).
3.
• Называется верхней границей.
• Используй, когда тип должен быть подклассом чего-то (например, утилита для работы с int, double, float).
4.
• Заставляет T реализовывать и A, и B.
• Используй, когда нужны обе особенности (например, сортировка объекта, который также требует валидации).
5.
• Это означает неизвестный тип.
• Используй, когда не важен тип, нужно только читать (например, печать элементов из любого списка).
6.
• Означает некоторый подкласс T.
• Используй при чтении из коллекции (например, чтение чисел из List<? extends Number> без модификации).
7.
• Означает некоторый суперкласс T.
• Используй при записи в коллекцию (например, добавление
8. Правило PECS
• Producer Extends, Consumer Super.
• Используй
9.
• Это сырой тип.
• Избегай — тк теряется типовая безопасность (например, компилятор не поймает, если добавишь неверные типы).
10. Стирание типов
• Java удаляет всю информацию об обобщениях во время выполнения.
• Поэтому нельзя использовать
11. Обобщённый конструктор
• Используй, когда конструктору нужен обобщённый параметр, даже если сам класс не обобщённый (например, инициализация с динамическими типами).
12. Обобщённый интерфейс
• Используй при преобразовании одного типа в другой (например, DTO → сущность).
13. Нельзя использовать примитивы
• Нельзя
• Используй обёртки (коллекции могут хранить только объекты, не примитивы).
14. Нельзя создавать массивы с обобщением
•
• Используй
15. Нельзя использовать подстановочные типы для вставки
• Нельзя вставлять в
• Используй
Подписывайся на наш канал в Max🟪
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
Если у вас есть общий ресурс (например, кэш, конфигурация или состояние сервиса), который часто читают разные потоки, но редко изменяют — обычный
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
🔥14❤4❤🔥2👍2
Вопрос с собеседования
Что такое String Pool в Java и как он работает?
Ответ:String Pool — это специальная область в памяти, где хранятся строковые литералы. Когда создается строка с помощью литерала (например, String s = "Hello";), JVM проверяет, существует ли уже такая строка в пуле. Если строка с таким значением уже есть, используется существующая строка, иначе создается новая строка и добавляется в пул. Это позволяет экономить память, так как одинаковые строковые литералы будут ссылаться на один и тот же объект в пуле.
Подписывайся на наш канал в Max🟪
Что такое String Pool в Java и как он работает?
Ответ:
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥4❤2