Java Portal | Программирование
12K subscribers
939 photos
69 videos
32 files
749 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Креативные (нетрадиционные) способы использования интерфейсов в Java

1) Конфигурация на основе интерфейсов (расширение паттерна Strategy)

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

🔸Инкапсулируется поведение, а не просто значения.
🔸Позволяет менять поведение динамически в рантайме, подставляя разные реализации.

2) Интерфейсы для method chaining с условным выполнением

Интерфейсы могут быть использованы для построения цепочек вызовов методов с возможностью условного выполнения. Это позволяет динамически пропускать определённые вызовы.

Используется при создании fluent API, где некоторые методы должны выполняться только при выполнении условий.
Это:

🔸Делает код более читаемым и выразительным.
🔸Избегает ненужных вызовов, если условие не выполнено.

Традиционный аналог:

if (conditionMet) {
obj.doSomething();
obj.doAnotherThing();
}


3) Маркировочные (tagging/marker) интерфейсы с проверкой по типу

Пустые интерфейсы можно использовать для "тегирования" классов и принятия решений во время выполнения или компиляции.

Это позволяет выполнять определённые действия, если класс реализует конкретный marker-интерфейс.

🔸Чистое разделение ролей без добавления логики
🔸Хорошо сочетается с reflection и generics

4) Наследование интерфейсов для реализации поведения по умолчанию

Интерфейсы с default-методами можно использовать для композиции переиспользуемой логики.

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

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Сборка мусора в JVM — всё, что нужно знать

1. Сборка мусора (GC) → Автоматическая очистка памяти

🔸JVM автоматически освобождает память от недостижимых объектов.
🔸Используется для избегания ручного управления памятью (например, неиспользуемые объекты List очищаются автоматически).

2. Heap → Основная область памяти для объектов

🔸Здесь хранятся все объекты Java.
🔸Делится на области: Young, Old и иногда Metaspace.

3. Молодое поколение (Young Generation) → Новые объекты (краткоживущие)

🔸Большинство новых объектов создаются здесь.
🔸Пример использования: String s = "abc" сначала попадает в эту область.

4. Старое поколение (Old Generation / Tenured) → Долгоживущие объекты

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

5. Metaspace → Хранение метаданных классов (начиная с Java 8+)

🔸Заменяет PermGen.
🔸Хранит структуру классов, информацию о методах (например, User.class, List.class).

6. Minor GC → Очистка молодого поколения

🔸Быстрая и частая.
🔸Срабатывает, когда заполняется пространство Eden (например, при множестве краткоживущих запросов).

7. Major (Full) GC → Очистка старого поколения и Metaspace

🔸Медленнее и реже.
🔸Срабатывает, когда почти заполнено старое поколение (например, при больших графах объектов или утечках памяти).

8. Stop-the-World (STW) → Приостановка приложения во время GC

🔸JVM замораживает все потоки на время GC.
🔸Может вызывать задержки (например, при большой полной сборке мусора).

9. GC Roots → Точки отсчета для достижимости объектов

🔸Включает ссылки из регистров, стэков потоков, загрузчиков классов.
🔸GC отслеживает от них «живые» объекты (например, локальные переменные в методе main()).

Основные типы сборщиков мусора

10. Serial GC → Однопоточный сборщик

🔸Простой, но останавливает всё приложение.
🔸Используется для малых heaps (например, CLI-инструменты или тестовые приложения).

11. Parallel GC → Многопоточный сборщик

🔸Ускоряет GC за счёт многопоточности.
🔸Используется в приложениях с приоритетом на производительность (например, batch-задачи, нагруженные серверы).

12. CMS (Concurrent Mark Sweep) → Сборщик с низкими паузами (УСТАРЕЛ)

🔸Работает в фоновом режиме с короткими паузами.
🔸Использовался в приложениях, чувствительных к задержкам (например, веб-серверы).

13. G1 GC → Сбалансированный сборщик с низкими паузами (по умолчанию с Java 9+)

🔸Делит heap на регионы; работает параллельно и конкурентно.
🔸Отличный универсальный сборщик (например, для микросервисов, real-time API).

14. ZGC → Сборщик с ультранизкими паузами

🔸Разработан для пауз в пределах миллисекунды.
🔸Используется в системах реального времени с большим heap (например, финтех, игры).

15. Shenandoah → Сборщик с низкими паузами (RedHat/OpenJDK)

🔸Конкурирует с ZGC.
🔸Применяется в больших heaps с постоянными требованиями к задержкам.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍75
В чем разница между SLEEP и WAIT в java?

Принадлежность

🔸sleep() — относится к классу Thread
🔸wait() — относится к классу Object

Назначение

🔸sleep() используется для приостановки потока на фиксированное время
🔸wait() используется для взаимодействия между потоками (межпоточная сигнализация)

Блокировка

🔸sleep() не освобождает монитор (lock остаётся удержанным)
🔸wait() освобождает монитор (lock)

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

🔸sleep() — когда нужно просто отложить выполнение потока
🔸wait() — когда один поток должен ожидать сигнал от другого потока

Нужен ли synchronized-блок?

🔸sleep() — нет
🔸wait() — да, должен вызываться внутри synchronized-блока или метода

Может быть прерван?

🔸sleep() — да, выбрасывает InterruptedException
🔸wait() — да, выбрасывает InterruptedException

Когда возобновляется

🔸sleep() — после указанного времени
🔸wait() — после вызова notify()/notifyAll() или при прерывании

Статический или экземплярный метод?

🔸sleep() — статический метод, вызывается как Thread.sleep()
🔸wait() — метод экземпляра, вызывается на объекте: obj.wait()

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥32
Профилирование JDBC с помощью VisualVM

Читать подробнее

👉 Java Portal | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥2👍1
HashSet в Java

HashSet — это коллекция для хранения уникальных элементов без гарантии порядка. Относится к пакету java.util и реализует интерфейс Set, внутренне опираясь на HashMap.

Основные особенности Java HashSet:

🔹Дубликаты игнорируются. Если добавить элемент, который уже есть в множестве — ничего не произойдёт.
🔹Элементы не упорядочены ни по добавлению, ни по значению.
🔹Допускается один null-элемент.

Производительность: Базовые операции add, remove, contains выполняются за константное время O(1), при условии качественной хеш-функции.

Даже если дважды добавить строку "BMW" — в сете она появится только один раз.


Часто используемые операции:

add(E e) — добавляет элемент, если его ещё нет
remove(Object o) — удаляет элемент, если он есть
contains(Object o) — проверяет наличие элемента
size() — возвращает количество элементов
clear() — очищает сет

Как работает внутри

HashSet использует внутренний HashMap, где элементы сета хранятся как ключи, а значением выступает фиктивный объект. Это позволяет обеспечить уникальность и быстрый доступ.

При выводе содержимого HashSet — элементы отображаются в произвольном порядке.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍4
🎁Подарок, после которого родные скажут: "Это лучше, чем внуки!

Конфеты «Мерси» — это мило. А вот как сказать «Спасибо» по-взрослому
Как вернуть родителям интерес к жизни? Воркбук "Жизнь прекрасна" — это лучший способ сказать позаботиться по-настоящему:

🧠 Тренирует мозг без усилий:
30 разнообразных упражнений на память, логику и внимание — всего 10 минут в день.
💖 Дарит радость и уверенность:
Мотивирующие задания напоминают: жизнь прекрасна, а они — важны и нужны. Каждый день!
Просто и эффективно:
Никакой рутины — только легкие, интересные задания.
💌 Ежедневная порция позитива для души и разума.

😙Воркбук — Ваше "спасибо" за детство.
Напоминание, что в 50+ жизнь только расцветает!

Хотите увидеть их искреннюю улыбку и услышать "Как здорово жить!"?

😎 Закажите "Жизнь прекрасна" сейчас:

😊 OZON
😊 Wildberries
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Чувак сделал минималистичный лаунчер для Minecraft для личного использования.

Теперь, когда кто-то из друзей спрашивает, какой лаунчер посоветуешь без вирусов — просто кидаю им свой :P


Ссылки на скачивание и исходники (если интересно, как такой написать):

🔹Скачать: https://github.com/sammwyy/MiniLaunch/releases
(Жми на ссылку с именем minilaunch.jar)

🔹Исходный код лаунчера на Java:
https://github.com/sammwyy/MiniLaunch

После скачивания просто дважды кликни по .jar, и всё готово

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4
JMH для микробенчмаркинга производительности:

JMH (Java Microbenchmark Harness) — это инструмент для измерения производительности небольших фрагментов кода, идеально подходит для оптимизации алгоритмов. В этом примере сравнивается простая цикл-реализация и использование Stream API.

→ JMH гарантирует точные и воспроизводимые тесты производительности
→ Используется для оптимизации критичных участков кода в продакшен-приложениях

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍2
Как работает HashMap в Java?

1. Внутреннее устройство – https://javarevisited.blogspot.com/2010/02/how-hashmap-works-in-java.html
2. Механика методов get и put – https://java67.com/2013/06/how-get-method-of-hashmap-or-hashtable-works-internally.html

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62
Термины, которые действительно должен знать каждый разработчик

• Иммутабельность. Данные, которые нельзя изменить после создания — вместо этого при обновлении создаются новые копии.

• Чистые функции. Функции, которые при одинаковом входе всегда возвращают одинаковый результат и не имеют побочных эффектов.

• Побочные эффекты. Любое внешнее воздействие вне функции (например, логгирование, вызов API, изменение внешнего состояния).

• Референциальная прозрачность. Выражение можно заменить его значением без изменения поведения программы.

• Мутация состояния. Изменение значения переменной или объекта со временем — часто не приветствуется в функциональном программировании.

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

• Декларативное программирование. Описание того, что нужно сделать, а не как это сделать (например, SQL, React, HTML).

• Императивное программирование. Пошаговые инструкции для выполнения задачи (например, циклы, условные операторы).

• Мемоизация. Кеширование результата функции, чтобы при повторных вызовах с теми же аргументами результат возвращался мгновенно.

• Когезия. Насколько чётко и логично связаны обязанности класса — высокая когезия = лучше дизайн.

• Тесная связанность. Классы чрезмерно зависят от внутренней реализации друг друга — изменения становятся рискованными.

• Утиная типизация. «Если выглядит как утка и крякает как утка — значит, это утка» — тип проверяется по поведению, а не по наследованию.

• Срезка объекта. При присваивании объекта производного класса объекту базового типа теряются дополнительные поля/методы — типичная ловушка в C++.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥3👀21
Лучшие способы логировать SQL-запросы в Spring Boot

Читать подробнее

👉 Java Portal | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍3
This media is not supported in your browser
VIEW IN TELEGRAM
Учись алгоритмам программирования с этим ресурсом - код, пошаговое выполнение и наглядное представление.

Более 70 алгоритмов на JavaScript, Java и C++ - идеально для практики и понимания логики.

http://algorithm-visualizer.org

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