Please open Telegram to view this post
VIEW IN TELEGRAM
Java с JMH для бенчмарков
Создай класс-бенчмарк, чтобы замерить производительность нужного кода😈
👉 Java Portal
Создай класс-бенчмарк, чтобы замерить производительность нужного кода
Please open Telegram to view this post
VIEW IN TELEGRAM
Утечки памяти из-за загрузчика классов в Java
Java-приложения могут терять память из-за цепочек загрузчиков классов, когда статические ссылки мешают сборщику мусора удалить старые загрузчики.
Такое часто происходит при повторном деплое на серверах вроде Tomcat — и приводит к скрытым, трудноуловимым утечкам памяти🍔
👉 Java Portal
Java-приложения могут терять память из-за цепочек загрузчиков классов, когда статические ссылки мешают сборщику мусора удалить старые загрузчики.
Такое часто происходит при повторном деплое на серверах вроде Tomcat — и приводит к скрытым, трудноуловимым утечкам памяти
Please open Telegram to view this post
VIEW IN TELEGRAM
Внутренности Java switch
Как компилятор выбирает, какую инструкцию использовать?
Первое, что нужно знать: любой switch в Java компилируется в одну из двух JVM-инструкций:
>
>
Прежде чем разбирать, как работает каждая из них, давайте посмотрим, как компилятор решает, какую выбрать.
Следующий код сгенерирует
А вот этот код сгенерирует
Видишь разницу?
👍 — да. вижу
🔥 — нужно разбирать
👉 Java Portal
Как компилятор выбирает, какую инструкцию использовать?
Первое, что нужно знать: любой switch в Java компилируется в одну из двух JVM-инструкций:
>
tableswitch
>
lookupswitch
Прежде чем разбирать, как работает каждая из них, давайте посмотрим, как компилятор решает, какую выбрать.
Следующий код сгенерирует
tableswitch
:public String tableSwitch() {
return switch (value) {
case 1 -> "one";
case 2 -> "two";
case 4 -> "four";
default -> "other";
};
}
А вот этот код сгенерирует
lookupswitch
:public String lookupSwitch() {
return switch (value) {
case 1 -> "one";
case 10 -> "ten";
case 100 -> "one hundred";
default -> "other";
};
}
Видишь разницу?
👍 — да. вижу
🔥 — нужно разбирать
Please open Telegram to view this post
VIEW IN TELEGRAM
Держите шикарный разбор, как работает
Что из них выберет компилятор — зависит от распределения case-ов
Автор показал, как это работает на байткоде > дизассемблирует, сравнивает варианты и объясняет, почему структура switch влияет на производительность
Очень наглядно и технически. Удачи🙈
👉 Java Portal
switch
в Java на уровне JVMЧто из них выберет компилятор — зависит от распределения case-ов
Автор показал, как это работает на байткоде > дизассемблирует, сравнивает варианты и объясняет, почему структура switch влияет на производительность
Очень наглядно и технически. Удачи
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring WebFlux с Server-Sent Events
Улучшай real-time приложения с помощью Spring WebFlux и Server-Sent Events🔥
👉 Java Portal
Улучшай real-time приложения с помощью Spring WebFlux и Server-Sent Events
Please open Telegram to view this post
VIEW IN TELEGRAM
Java-разработчики, готовы контейнеризировать свои приложения как профи?
Вот универсальный гайд по основным командам Docker — специально для вас
От сборки до деплоя — всё в одном сниппете
❤️
👉 Java Portal
Вот универсальный гайд по основным командам Docker — специально для вас
От сборки до деплоя — всё в одном сниппете
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет для IntelliJ — свой значок проекта 👩💻
Можно задать кастомную иконку для проекта в IntelliJ — она будет отображаться на экране приветствия
👉 Java Portal
Можно задать кастомную иконку для проекта в IntelliJ — она будет отображаться на экране приветствия
Please open Telegram to view this post
VIEW IN TELEGRAM
Ты создаёшь Java-класс для генерации 128-битных токенов, поэтому пишешь следующий тест:
Что мы должны написать в проверках (assert)? Мы могли бы использовать обычный экземпляр
Другой вариант — заменить тип Random на интерфейс
Где
Интерфейс
🔥— всё верно
👍— если пост оказался полезным
👉 Java Portal
Random random = new SecureRandom();
Tokens tokens = new Tokens(random);
Token result = tokens.next();
assertEquals(result.high(), ???);
assertEquals(result.low(), ???);
Что мы должны написать в проверках (assert)? Мы могли бы использовать обычный экземпляр
Random
с заданным сидом.Другой вариант — заменить тип Random на интерфейс
RandomGenerator
:RandomGenerator generator = fixedGenerator(1L, 2L);
Tokens tokens = new Tokens(generator);
Token result = tokens.next();
assertEquals(result.high(), 1L);
assertEquals(result.low(), 2L);
Где
fixedGenerator
выглядит следующим образом:private RandomGenerator fixedGenerator(long... longs) {
return new RandomGenerator() {
private final long[] values = longs.clone();
private int index;
@Override
public final long nextLong() {
int currentIndex = index++;
if (index == values.length) {
index = 0;
}
return values[currentIndex];
}
};
}
Интерфейс
java.util.random.RandomGenerator
был добавлен в JDK 17 и реализуется классом java.util.Random
🔥— всё верно
👍— если пост оказался полезным
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Совет для джавистов в IntelliJ IDEA:
Знаешь ли ты, что можно использовать встроенный HTTP-клиент IntelliJ, чтобы ускорить работу с Java?
После этого тебе Postman больше не понадобится.
А какая у тебя любимая скрытая фишка?🌹
👉 Java Portal
Знаешь ли ты, что можно использовать встроенный HTTP-клиент IntelliJ, чтобы ускорить работу с Java?
После этого тебе Postman больше не понадобится.
А какая у тебя любимая скрытая фишка?
Please open Telegram to view this post
VIEW IN TELEGRAM
Анонс: Azure Command Launcher для Java
jaz — новый инструмент запуска JVM, оптимизированный под Azure. Он предлагает более подходящие настройки по умолчанию для Java-приложений в контейнерах и на виртуалках.
И это ещё не всё — впереди больше обновлений.🤙
> подробнее
👉 Java Portal
jaz — новый инструмент запуска JVM, оптимизированный под Azure. Он предлагает более подходящие настройки по умолчанию для Java-приложений в контейнерах и на виртуалках.
И это ещё не всё — впереди больше обновлений.
> подробнее
Please open Telegram to view this post
VIEW IN TELEGRAM
Понимание
Все эти ключевые слова используются в ООП для управления наследованием, конструкторной логикой, ссылками на текущий и родительский объекты, а также для оптимизации работы с памятью и предотвращения переопределения.
> Читать подробнее с примерами🫡
Полезно для интервью и системного понимания Java
👉 Java Portal
static, final, super, super(), this()
и this
в Java — это база для любого Java-разработчика.Все эти ключевые слова используются в ООП для управления наследованием, конструкторной логикой, ссылками на текущий и родительский объекты, а также для оптимизации работы с памятью и предотвращения переопределения.
> Читать подробнее с примерами
Полезно для интервью и системного понимания Java
Please open Telegram to view this post
VIEW IN TELEGRAM
JDK 21 сопоставление с шаблоном (pattern matching) для switch стало постоянной фичей, а не превью — согласно JEP 441
Теперь можно писать такой switch:
Такой switch-выражение во время выполнения под капотом обрабатывается через объект, созданный с помощью класса
Пример:
Результат выполнения:
🔥 — знал об этом
👍 — полезно
👉 Java Portal
Теперь можно писать такой switch:
private String format(Number n) {
return switch (n) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case null -> "null";
default -> String.format("%s %s", n.getClass().getSimpleName(), n);
};
}
Такой switch-выражение во время выполнения под капотом обрабатывается через объект, созданный с помощью класса
SwitchBootstraps
.Пример:
void main() throws Throwable {
print(123);
print(456L);
print(7.89);
print(null);
print(7.89F);
}
private void print(Number n) throws Throwable {
IO.println(format(n));
}
private String format(Number n) throws Throwable {
var lookup = MethodHandles.lookup();
var callsite = SwitchBootstraps.typeSwitch(
lookup,
"",
MethodType.methodType(int.class, Number.class, int.class),
Integer.class, Long.class, Double.class
);
var target = callsite.getTarget();
int result = (int) target.invokeExact(n, 0);
return switch (result) {
case 0 -> { Integer i = (Integer) n; yield String.format("int %d", i); }
case 1 -> { Long l = (Long) n; yield String.format("long %d", l); }
case 2 -> { Double d = (Double) n; yield String.format("double %f", d); }
case -1 -> "null";
default -> String.format("%s %s", n.getClass().getSimpleName(), n);
};
}
Результат выполнения:
int 123
long 456
double 7.890000
null
Float 7.89
🔥 — знал об этом
👍 — полезно
Please open Telegram to view this post
VIEW IN TELEGRAM
Базовые вопросы по Core Java на собеседовании
1. В чём разница между
2. Объясните концепцию ООП в Java.
3. Чем отличаются HashMap, LinkedHashMap, TreeMap и Hashtable?
4. В чём разница между ArrayList и LinkedList?
5. Что такое контракт
6, Как работает управление памятью в Java (heap, stack, GC)?
7. Разница между
8. Какие бывают типы исключений в Java? Checked vs Unchecked?
9. Что такое синглтон-класс? Как его реализовать?
10. Объясните ключевые слова
👉 Java Portal
1. В чём разница между
==
и .equals()
в Java?2. Объясните концепцию ООП в Java.
3. Чем отличаются HashMap, LinkedHashMap, TreeMap и Hashtable?
4. В чём разница между ArrayList и LinkedList?
5. Что такое контракт
hashCode()
и equals()
?6, Как работает управление памятью в Java (heap, stack, GC)?
7. Разница между
final, finally
и finalize()
?8. Какие бывают типы исключений в Java? Checked vs Unchecked?
9. Что такое синглтон-класс? Как его реализовать?
10. Объясните ключевые слова
volatile, synchronized
и transient
Please open Telegram to view this post
VIEW IN TELEGRAM
Тридцатый день рождения Java
Сегодня 23 мая и Java исполняется 30 лет!
Java впервые вышла в альфа-версии в мае 1995 года, а первая публичная версия была выпущена в январе 1996 года
С юбилеем, родной🥇
👉 Java Portal
Сегодня 23 мая и Java исполняется 30 лет!
Java впервые вышла в альфа-версии в мае 1995 года, а первая публичная версия была выпущена в январе 1996 года
С юбилеем, родной
Please open Telegram to view this post
VIEW IN TELEGRAM
Рассмотрим следующий Java-файл, в котором объявлены два класса —
Следующая программа использует оба класса, но из другого пакета. При этом она не ссылается напрямую на класс Escape по имени — и успешно компилируется и выполняется без ошибок:
Но если последнюю переменную c тоже объявить с использованием
то компиляция завершится ошибкой:
🔥 — знал об этом
👍 — полезно
👉 Java Portal
Library
и Escape
. Обратите внимание: класс Escape имеет package-private доступ, так как у него нет явного модификатора доступа:// internal/Library.java
package internal;
public interface Library {
static Escape create() {
return new Escape();
}
}
class Escape {}
Следующая программа использует оба класса, но из другого пакета. При этом она не ссылается напрямую на класс Escape по имени — и успешно компилируется и выполняется без ошибок:
void main() {
Object a = internal.Library.create();
IO.println(a);
var b = internal.Library.create();
IO.println(b);
Object c = internal.Library.create();
IO.println(c.toString()); // обратите внимание на вызов toString()
}
Но если последнюю переменную c тоже объявить с использованием
var
, как здесь:var c = internal.Library.create();
то компиляция завершится ошибкой:
"Object.toString() is defined in an inaccessible class or interface"
🔥 — знал об этом
👍 — полезно
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Гайд на кэширование в Java с помощью Spring Boot, Redis и Docker
Если ты хочешь понять, как эффективно реализовать кэш в Java-приложении — в этом гайде рассказывается, как использовать связку Spring Boot + Redis внутри Docker-контейнера.
Подробно разбирается:
> как работает кэш, аннотации Spring (
Также показано, как протестировать кэш и избежать типичных ошибок.
Полезно для тех, кто хочет ускорить приложение и уменьшить нагрузку на БД😡
👉 Java Portal
Если ты хочешь понять, как эффективно реализовать кэш в Java-приложении — в этом гайде рассказывается, как использовать связку Spring Boot + Redis внутри Docker-контейнера.
Подробно разбирается:
> как работает кэш, аннотации Spring (
@Cacheable
и др), настройка Redis и интеграция всего этого в микросервис.Также показано, как протестировать кэш и избежать типичных ошибок.
Полезно для тех, кто хочет ускорить приложение и уменьшить нагрузку на БД
Please open Telegram to view this post
VIEW IN TELEGRAM
maven-cheat-sheet.pdf
147.3 KB
Основные команды Maven для Java-разработчиков
Maven — это мощный инструмент автоматизации сборки, который используется в основном для Java-проектов. Он помогает управлять зависимостями, сборкой и жизненным циклом проекта
👉 Java Portal
Maven — это мощный инструмент автоматизации сборки, который используется в основном для Java-проектов. Он помогает управлять зависимостями, сборкой и жизненным циклом проекта
$ mvn archetype:generate
Создание нового Maven-проекта
$ mvn clean
Очистка директории target
$ mvn compile
Компиляция исходного кода
$ mvn test
Запуск unit-тестов
$ mvn package
Сборка проекта в JAR/WAR
$ mvn install
Установка артефакта в локальный Maven-репозиторий
$ mvn install -DskipTests
Пропустить тесты при сборке
$ mvn spring-boot:run
Запуск Spring Boot приложения (если используется spring-boot-maven-plugin)
$ mvn dependency:resolve
Обновление зависимостей
$ mvn dependency:tree
Вывод дерева зависимостей
$ mvn clean compile package
Запуск целей в указанной фазе
$ mvn validate
Проверка структуры проекта
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое JWT?
⇨ JSON Web Token — это открытый стандарт (RFC 7519) для безопасной передачи данных между сторонами в виде JSON-объекта.
⇨ Это компактный и самодостаточный способ представить набор утверждений (claims) между двумя сторонами.
Структура JWT
JWT состоит из трёх частей, разделённых точками (.):
1. Header
⇨ Указывает алгоритм подписи (например, HS256 или RS256) и тип токена (JWT).
2. Payload (Claims)
⇨ Содержит утверждения о сущности (чаще всего — пользователе) и дополнительную информацию.
Типы claims:
➀ Registered claims — стандартизированные: iss, exp, sub, aud и т.д.
➁ Public claims — настраиваются вашим приложением.
➂ Private claims — используются по соглашению между сторонами.
3. Signature
⇨ Создаётся путём подписи закодированных header и payload с использованием секрета или приватного ключа.
⇨ Гарантирует подлинность и целостность токена.
Безопасность
При работе с JWT и другими механизмами аутентификации очень важен качественный ревью код.
Инструменты вроде coderabbitai помогают находить уязвимости уже на этапе pull request'ов — с контекстным и построчным анализом.
Такие помощники формируют привычку писать безопасный и чистый код с самого начала💖
👉 Java Portal
⇨ JSON Web Token — это открытый стандарт (RFC 7519) для безопасной передачи данных между сторонами в виде JSON-объекта.
⇨ Это компактный и самодостаточный способ представить набор утверждений (claims) между двумя сторонами.
Структура JWT
JWT состоит из трёх частей, разделённых точками (.):
1. Header
⇨ Указывает алгоритм подписи (например, HS256 или RS256) и тип токена (JWT).
2. Payload (Claims)
⇨ Содержит утверждения о сущности (чаще всего — пользователе) и дополнительную информацию.
Типы claims:
➀ Registered claims — стандартизированные: iss, exp, sub, aud и т.д.
➁ Public claims — настраиваются вашим приложением.
➂ Private claims — используются по соглашению между сторонами.
3. Signature
⇨ Создаётся путём подписи закодированных header и payload с использованием секрета или приватного ключа.
⇨ Гарантирует подлинность и целостность токена.
Безопасность
При работе с JWT и другими механизмами аутентификации очень важен качественный ревью код.
Инструменты вроде coderabbitai помогают находить уязвимости уже на этапе pull request'ов — с контекстным и построчным анализом.
Такие помощники формируют привычку писать безопасный и чистый код с самого начала
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотации кэширования Spring Boot
👉 Java Portal
@EnableCaching
// Включает кэш в проекте
// Ставится на конфигурационный класс
@Cacheable
// Кэширует результат метода
// Используй для дорогих в вычислении методов
@CachePut
// Обновляет кэш новым результатом
// Когда метод меняет данные и нужно обновить кэш
@CacheEvict
// Удаляет записи из кэша
// При удалении или обновлении данных
@Caching
// Объединяет несколько кэш-аннотаций
// Когда на методе нужно и @Put, и @Evict, и т.д.
@CacheConfig
// Общие настройки кэша на уровне класса
// Чтобы не дублировать параметры в каждой аннотации
Please open Telegram to view this post
VIEW IN TELEGRAM