Java Portal | Программирование
11.6K subscribers
858 photos
66 videos
28 files
682 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
加入频道
Упростите свой бизнес-код на Java с помощью Flow DSL

🔜 Читать: клик

👉 Java Portal | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
Хочешь чистые REST API на Java?

Используй:

> @RestController

> @RequestBody

> @PathVariable

> @ResponseStatus

Spring REST помогает писать код просто и понятно 🧑‍💻

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое LinkedList (двусвязный список) в Java?

> Состоит из узлов, где каждый узел содержит данные и ссылки на следующий и предыдущий узлы
> Быстрые вставки и удаления — O(1), если есть ссылка на нужный узел
> Медленный доступ по индексу — O(n), т.к. нужно проходить список последовательно

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

> Частые вставки и удаления — особенно в начале или в середине списка
> Реализация очередей и деков — удобно добавлять в конец и забирать из начала
> Работа с большими объёмами данных, где перераспределение памяти (как в ArrayList) может быть дорогим. LinkedList не требует непрерывной памяти
> Undo/Redo-механизмы — например, в текстовых редакторах, где нужно быстро добавлять и удалять действия из истории

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Метод FileSystems.newFileSystem(Path) появился ещё в JDK 13 (2019), но многие до сих пор о нём не знают

Он позволяет обращаться к содержимому файла, например ZIP-архива, как к файловой системе.

Пример Java-программы:

void main() {
Path src = Path.of("/opt/jdk-24/lib/src.zip");

try (FileSystem fs = FileSystems.newFileSystem(src)) {
for (Path root : fs.getRootDirectories()) {
try (Stream<Path> walk = Files.walk(root, 1)) {
walk.sorted().forEach(IO::println);
}
}
}
}


Результат выполнения:

/
/java.base
/java.compiler
/java.datatransfer
/java.desktop
/java.instrument
/java.logging
...
/jdk.unsupported
/jdk.unsupported.desktop
/jdk.xml.dom
/jdk.zipfs


До появления этого метода нужно было использовать более сложный код с URI и явно указывать схему:

URI src = URI.create("jar:file:///opt/jdk-24/lib/src.zip");

try (FileSystem fs = FileSystems.newFileSystem(src, Map.of())) {
...
}


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Как создавать многомодульные проекты в Spring Boot

🔜 Читать: клик

👉 Java Portal | #cтатья
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
Please open Telegram to view this post
VIEW IN TELEGRAM
Внутренности Java switch

Как компилятор выбирает, какую инструкцию использовать?

Первое, что нужно знать: любой 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";
};
}


Видишь разницу?

👍да. вижу
🔥 нужно разбирать

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Держите шикарный разбор, как работает switch в Java на уровне JVM

Что из них выберет компилятор — зависит от распределения case-ов

Автор показал, как это работает на байткоде > дизассемблирует, сравнивает варианты и объясняет, почему структура switch влияет на производительность

Очень наглядно и технически. Удачи 🙈

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring WebFlux с Server-Sent Events

Улучшай real-time приложения с помощью Spring WebFlux и Server-Sent Events 🔥

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Java-разработчики, готовы контейнеризировать свои приложения как профи?

Вот универсальный гайд по основным командам Docker — специально для вас

От сборки до деплоя — всё в одном сниппете

❤️

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет для IntelliJ — свой значок проекта 👩‍💻

Можно задать кастомную иконку для проекта в IntelliJ — она будет отображаться на экране приветствия

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Ты создаёшь Java-класс для генерации 128-битных токенов, поэтому пишешь следующий тест:

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

🔥всё верно
👍 если пост оказался полезным

👉 Java Portal
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
Please open Telegram to view this post
VIEW IN TELEGRAM
Анонс: Azure Command Launcher для Java

jaz — новый инструмент запуска JVM, оптимизированный под Azure. Он предлагает более подходящие настройки по умолчанию для Java-приложений в контейнерах и на виртуалках.

И это ещё не всё — впереди больше обновлений. 🤙

> подробнее

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Понимание static, final, super, super(), this() и this в Java — это база для любого Java-разработчика.

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

> Читать подробнее с примерами 🫡

Полезно для интервью и системного понимания Java

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
JDK 21 сопоставление с шаблоном (pattern matching) для switch стало постоянной фичей, а не превью — согласно JEP 441

Теперь можно писать такой 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


🔥 знал об этом
👍полезно

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Базовые вопросы по Core Java на собеседовании

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

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Тридцатый день рождения Java

Сегодня 23 мая и Java исполняется 30 лет!

Java впервые вышла в альфа-версии в мае 1995 года, а первая публичная версия была выпущена в январе 1996 года

С юбилеем, родной 🥇

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Рассмотрим следующий Java-файл, в котором объявлены два класса — 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"


🔥 знал об этом
👍полезно

👉 Java Portal
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 (@Cacheable и др), настройка Redis и интеграция всего этого в микросервис.

Также показано, как протестировать кэш и избежать типичных ошибок.

Полезно для тех, кто хочет ускорить приложение и уменьшить нагрузку на БД 😡

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM