💡 Java/Spring: отдавайте предпочтение constructor injection вместо
✅ Field injection скрывает обязательные dependencies
✅ Constructor injection делает зависимости явными
✅ Проще писать тесты: можно передать mocks напрямую, без запуска Spring context
#Java #SpringBoot
👉 Java Portal
@Autowired для полей.✅ Field injection скрывает обязательные dependencies
✅ Constructor injection делает зависимости явными
✅ Проще писать тесты: можно передать mocks напрямую, без запуска Spring context
#Java #SpringBoot
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Шпаргалка по проектированию веб систем System Design 101
Подробное руководство по архитектуре веб‑сервисов, которое обязательно стоит сохранить. Это перевод статьи от ByteByteGo опубликованный на Хабре
Сохраняем за лайк❤️
👉 Java Portal
Подробное руководство по архитектуре веб‑сервисов, которое обязательно стоит сохранить. Это перевод статьи от ByteByteGo опубликованный на Хабре
Сохраняем за лайк
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9❤6
Java-разработчики:
Почему
И какой здесь компромисс между расходом памяти и производительностью при resize?
👉 Java Portal
Почему
ArrayList увеличивает свою ёмкость примерно на 50%, когда заканчивается свободное место? Почему бы просто не удваивать capacity?И какой здесь компромисс между расходом памяти и производительностью при resize?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Java-разработчики, знаете разницу между Shallow Copy и Deep Copy?
Вы копируете объект, но что именно создаётся — независимая копия объекта или копия ссылок на вложенные объекты?
Shallow copy копирует ссылки на объекты, поэтому вложенные объекты продолжают указывать на те же области памяти. Deep copy создаёт новый объект и рекурсивно копирует всё его содержимое.
То есть shallow copy копирует структуру со ссылками на вложенные объекты, а deep copy создаёт независимую копию всего дерева объектов.
Вот пример на Java
👉 Java Portal
Вы копируете объект, но что именно создаётся — независимая копия объекта или копия ссылок на вложенные объекты?
Shallow copy копирует ссылки на объекты, поэтому вложенные объекты продолжают указывать на те же области памяти. Deep copy создаёт новый объект и рекурсивно копирует всё его содержимое.
То есть shallow copy копирует структуру со ссылками на вложенные объекты, а deep copy создаёт независимую копию всего дерева объектов.
Вот пример на Java
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Готовимся к System Design интервью уровня Middle и Senior
Полезный конспект по проектированию масштабируемых систем по книге Алекса Сюй System Design Interview.
Схемы, объяснения архитектурных решений и разборы популярных задач: от сокращения ссылок и ограничения частоты запросов до проектирования чатов и распределённых сервисов.
👉 Java Portal
Полезный конспект по проектированию масштабируемых систем по книге Алекса Сюй System Design Interview.
Схемы, объяснения архитектурных решений и разборы популярных задач: от сокращения ссылок и ограничения частоты запросов до проектирования чатов и распределённых сервисов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Java-разработчики, в чём разница между volatile и synchronized?
Многие используют их. Но все ли понимают, как они связаны с кешем CPU, видимостью изменений в памяти, атомарностью и взаимным исключением?
Вопрос: два потока выполняют
👉 Java Portal
Многие используют их. Но все ли понимают, как они связаны с кешем CPU, видимостью изменений в памяти, атомарностью и взаимным исключением?
volatile гарантирует видимость изменений между потоками. synchronized обеспечивает видимость и взаимное исключение: критическую секцию под одним и тем же монитором может выполнять только один поток за раз.Вопрос: два потока выполняют
count++, а переменная count объявлена как volatile. Потокобезопасен ли такой код? Почему?Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Многие разработчики используют Java каждый день. Но мало кто знает, почему он стал одним из самых успешных языков в мире.
Вот его основные особенности:
Независимость от платформы
Скомпилируйте код в байт-код один раз и запускайте его на любой машине с JVM.
Объектно-ориентированный подход
Всё строится вокруг классов и объектов, что упрощает организацию и сопровождение крупных приложений.
Надёжность
Автоматическая сборка мусора, строгая проверка типов и обработка исключений помогают избежать многих распространённых проблем во время выполнения.
Высокая производительность
JIT-компилятор (Just-In-Time) оптимизирует часто выполняемый код, обеспечивая скорость, близкую к нативной.
Многопоточность
Встроенные API для работы с конкурентностью упрощают параллельное выполнение нескольких задач.
Проверен на практике
Банковские системы, платформы электронной коммерции, Android-приложения и корпоративные бэкенды: Java лежит в основе критически важного ПО в самых разных отраслях.
👉 Java Portal
Вот его основные особенности:
Независимость от платформы
Скомпилируйте код в байт-код один раз и запускайте его на любой машине с JVM.
Объектно-ориентированный подход
Всё строится вокруг классов и объектов, что упрощает организацию и сопровождение крупных приложений.
Надёжность
Автоматическая сборка мусора, строгая проверка типов и обработка исключений помогают избежать многих распространённых проблем во время выполнения.
Высокая производительность
JIT-компилятор (Just-In-Time) оптимизирует часто выполняемый код, обеспечивая скорость, близкую к нативной.
Многопоточность
Встроенные API для работы с конкурентностью упрощают параллельное выполнение нескольких задач.
Проверен на практике
Банковские системы, платформы электронной коммерции, Android-приложения и корпоративные бэкенды: Java лежит в основе критически важного ПО в самых разных отраслях.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2
Бесплатные ресурсы для изучения Java
Конспект Effective Java — HugoMatilla/Effective-JAVA-Summary
Паттерны проектирования на Java — iluwatar/java-design-patterns
Подготовка к техническим собеседованиям — kdn251/interviews
Сохраняйте в закладки!
👉 Java Portal
Конспект Effective Java — HugoMatilla/Effective-JAVA-Summary
Паттерны проектирования на Java — iluwatar/java-design-patterns
Подготовка к техническим собеседованиям — kdn251/interviews
Сохраняйте в закладки!
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - HugoMatilla/Effective-JAVA-Summary: Summary of the book Effective Java 2nd Edition by Joshua Bloch
Summary of the book Effective Java 2nd Edition by Joshua Bloch - HugoMatilla/Effective-JAVA-Summary
❤1
Каждый Java-разработчик использует
Почему его ёмкость всегда равна степени двойки?
Почему не 10? Почему не 100? Почему Java увеличивает её именно так?
Что сломается или станет работать медленнее, если ёмкость будет равна 15, 30 или 100?
👉 Java Portal
HashMap. Но задумывались ли вы…Почему его ёмкость всегда равна степени двойки?
Почему не 10? Почему не 100? Почему Java увеличивает её именно так?
16 → 32 → 64 → 128 → 256Что сломается или станет работать медленнее, если ёмкость будет равна 15, 30 или 100?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Java: используйте Deque вместо Stack для работы по принципу LIFO («последним пришёл — первым вышел»).
Используйте
#Java #Collections
👉 Java Portal
Stack — устаревший класс, который наследуется от Vector и синхронизирует каждый вызов.Deque предоставляет те же методы push, pop и peek.Используйте
ArrayDeque: он быстрее и рекомендуется начиная с Java 6.#Java #Collections
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
Во многих приложениях есть такой эндпоинт.
Фронтенд удаляет JWT после того, как пользователь нажимает «Выйти». Но вот вопрос… Действительно ли пользователь вышел из системы?
Что, если:
• JWT скопировали до выхода?
• Срок действия токена ещё не истёк?
• Другое устройство всё ещё использует тот же токен?
Будет ли ваш бэкенд по-прежнему принимать этот JWT? Как вы реализуете выход из системы в архитектуре со stateless JWT?
👉 Java Portal
Фронтенд удаляет JWT после того, как пользователь нажимает «Выйти». Но вот вопрос… Действительно ли пользователь вышел из системы?
Что, если:
• JWT скопировали до выхода?
• Срок действия токена ещё не истёк?
• Другое устройство всё ещё использует тот же токен?
Будет ли ваш бэкенд по-прежнему принимать этот JWT? Как вы реализуете выход из системы в архитектуре со stateless JWT?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Java-разработчики,
Но он не блокирует всю коллекцию при каждом обновлении. Что же происходит, когда несколько потоков изменяют её одновременно?
До Java 8 → блокировки на уровне сегментов.
Java 8+ → CAS + синхронизация на уровне корзин.
Как это улучшает работу с конкурентным доступом? И когда
👉 Java Portal
ConcurrentHashMap потокобезопасен.Но он не блокирует всю коллекцию при каждом обновлении. Что же происходит, когда несколько потоков изменяют её одновременно?
До Java 8 → блокировки на уровне сегментов.
Java 8+ → CAS + синхронизация на уровне корзин.
Как это улучшает работу с конкурентным доступом? И когда
ConcurrentHashMap всё ещё нужны блокировки?Please open Telegram to view this post
VIEW IN TELEGRAM
Java-разработчики,
Звучит затратно, правда? И всё же в некоторых продакшен-системах он может работать быстрее синхронизированных коллекций.
Почему?
👉 Java Portal
CopyOnWriteArrayList создаёт копию всего внутреннего массива при каждом изменении.Звучит затратно, правда? И всё же в некоторых продакшен-системах он может работать быстрее синхронизированных коллекций.
Почему?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Проблема в продакшене. Приложение зависло.
Вы запускаете:
Через несколько секунд получаете:
Но главный вопрос… Как JVM обнаружила взаимную блокировку? Что происходит внутри?
👉 Java Portal
Вы запускаете:
jstack <pid>
Через несколько секунд получаете:
Found one Java-level deadlock
Но главный вопрос… Как JVM обнаружила взаимную блокировку? Что происходит внутри?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
💡 Java: не создавайте ресурсоёмкие объекты, пока они действительно не понадобятся.
✅ Инициализация полей заранее тратит время и память впустую, если код, который их использует, так и не выполнится.
✅ Используйте ленивую инициализацию при первом обращении,
✅ Подходит для кэшей, клиентов и тяжёлых конфигураций.
👉 Java Portal
✅ Инициализация полей заранее тратит время и память впустую, если код, который их использует, так и не выполнится.
✅ Используйте ленивую инициализацию при первом обращении,
Supplier или паттерн Holder.✅ Подходит для кэшей, клиентов и тяжёлых конфигураций.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1🤔1
Большинство Java-разработчиков используют эти термины каждый день. Удивительно, но многие до сих пор их путают. Вот простой способ запомнить разницу.
JDK (Java Development Kit)
• Всё необходимое для разработки Java-приложений:
• Компилятор
• Инструменты отладки
• Инструменты упаковки
• Среда выполнения JRE
JRE (Java Runtime Environment)
• Всё необходимое для запуска Java-приложений:
• Основные библиотеки
• Вспомогательные файлы
• Виртуальная машина JVM
JVM (Java Virtual Machine)
• Движок, который выполняет Java-байткод:
• Загружает классы
• Проверяет байткод
• JIT-компилирует часто выполняемый код
• Управляет памятью и сборкой мусора
Как запомнить:
JDK = JRE + инструменты разработки
JRE = JVM + библиотеки
JVM = выполнение байткода
Представьте приготовление кофе
• JDK — кофемашина, зёрна, кофемолка и всё необходимое для приготовления кофе.
• JRE — готовый к употреблению кофе.
• JVM — нагреватель, благодаря которому кофе заваривается.
Если вы пишете код, устанавливайте JDK. Если только запускаете Java-приложение, достаточно JRE, хотя современные дистрибутивы JDK обычно уже включают необходимую среду выполнения.
👉 Java Portal
JDK (Java Development Kit)
• Всё необходимое для разработки Java-приложений:
• Компилятор
javac• Инструменты отладки
• Инструменты упаковки
• Среда выполнения JRE
JRE (Java Runtime Environment)
• Всё необходимое для запуска Java-приложений:
• Основные библиотеки
• Вспомогательные файлы
• Виртуальная машина JVM
JVM (Java Virtual Machine)
• Движок, который выполняет Java-байткод:
• Загружает классы
• Проверяет байткод
• JIT-компилирует часто выполняемый код
• Управляет памятью и сборкой мусора
Как запомнить:
JDK = JRE + инструменты разработки
JRE = JVM + библиотеки
JVM = выполнение байткода
Представьте приготовление кофе
• JDK — кофемашина, зёрна, кофемолка и всё необходимое для приготовления кофе.
• JRE — готовый к употреблению кофе.
• JVM — нагреватель, благодаря которому кофе заваривается.
Если вы пишете код, устанавливайте JDK. Если только запускаете Java-приложение, достаточно JRE, хотя современные дистрибутивы JDK обычно уже включают необходимую среду выполнения.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Эволюция языков программирования
1940-е → Машинный код
⬇️
1950-е → Ассемблер
⬇️
1960-е → FORTRAN • COBOL • BASIC
⬇️
1970-е → C • Pascal
⬇️
1980-е → C++ • Objective-C
⬇️
1990-е → Java • JavaScript • PHP
⬇️
2000-е → C# • Ruby • Scala
⬇️
2010-е → Go • Rust • Kotlin • Swift
⬇️
2020-е → Программирование с помощью ИИ
Каждое поколение решало свои задачи:
• Машинный код → прямое управление оборудованием.
• Ассемблер → инструкции, понятные человеку.
• C и Pascal → переносимость программ и структурное программирование.
• Java и JavaScript → корпоративное ПО и современный веб.
• C#, Ruby и Scala → продуктивность разработчиков и масштабируемые приложения.
• Go, Rust, Kotlin и Swift → облачные системы, безопасность памяти и современные платформы.
• Программирование с помощью ИИ → ускорение разработки, при котором архитектурные решения по-прежнему принимают люди.
Что самое интересное?
Языки развивались не потому, что старые становились бесполезными. Каждое новое поколение ПО приносило новые задачи. И вот подтверждение:
• На C по-прежнему пишут операционные системы.
• На Java работают миллионы корпоративных приложений.
• JavaScript по-прежнему доминирует в вебе.
• Python остаётся ведущим языком в ИИ и анализе данных.
Новое не заменяет старое. Оно расширяет возможности. На каком языке вы написали свой первый Hello, World!?
👉 Java Portal
1940-е → Машинный код
1950-е → Ассемблер
1960-е → FORTRAN • COBOL • BASIC
1970-е → C • Pascal
1980-е → C++ • Objective-C
1990-е → Java • JavaScript • PHP
2000-е → C# • Ruby • Scala
2010-е → Go • Rust • Kotlin • Swift
2020-е → Программирование с помощью ИИ
Каждое поколение решало свои задачи:
• Машинный код → прямое управление оборудованием.
• Ассемблер → инструкции, понятные человеку.
• C и Pascal → переносимость программ и структурное программирование.
• Java и JavaScript → корпоративное ПО и современный веб.
• C#, Ruby и Scala → продуктивность разработчиков и масштабируемые приложения.
• Go, Rust, Kotlin и Swift → облачные системы, безопасность памяти и современные платформы.
• Программирование с помощью ИИ → ускорение разработки, при котором архитектурные решения по-прежнему принимают люди.
Что самое интересное?
Языки развивались не потому, что старые становились бесполезными. Каждое новое поколение ПО приносило новые задачи. И вот подтверждение:
• На C по-прежнему пишут операционные системы.
• На Java работают миллионы корпоративных приложений.
• JavaScript по-прежнему доминирует в вебе.
• Python остаётся ведущим языком в ИИ и анализе данных.
Новое не заменяет старое. Оно расширяет возможности. На каком языке вы написали свой первый Hello, World!?
Please open Telegram to view this post
VIEW IN TELEGRAM
🏆2😁1
Docker прост, пока всё работает.
Но что делать, если контейнер постоянно перезапускается, логи пропали, а приложение теряет данные после перезапуска? Тут уже недостаточно одного
Команды Docker, которые стоит знать каждому разработчику:
•
•
•
•
•
•
•
•
В продакшене не забывайте:
• Использовать небольшие базовые образы из доверенных источников.
• Запускать приложение от пользователя без прав root.
• Настраивать проверки работоспособности и ограничения ресурсов.
• Не хранить секреты в Docker-образах.
• Использовать тома для постоянного хранения данных.
Подготовили шпаргалку по Docker для продакшена: архитектура, команды, примеры, сети, тома, Compose и советы по диагностике проблем.
👉 Java Portal
Но что делать, если контейнер постоянно перезапускается, логи пропали, а приложение теряет данные после перезапуска? Тут уже недостаточно одного
docker run.Команды Docker, которые стоит знать каждому разработчику:
•
docker logs -f → следить за логами приложения.•
docker exec -it → выполнять команды внутри работающего контейнера для диагностики.•
docker inspect → изучать конфигурацию контейнера.•
docker stats → проверять потребление CPU и памяти.•
docker network → управлять сетями и разбираться с соединениями между сервисами.•
docker volume → управлять томами для хранения данных вне жизненного цикла контейнера.•
docker compose → запускать несколько сервисов вместе.•
docker system df → проверять, сколько места на диске занимает Docker.В продакшене не забывайте:
• Использовать небольшие базовые образы из доверенных источников.
• Запускать приложение от пользователя без прав root.
• Настраивать проверки работоспособности и ограничения ресурсов.
• Не хранить секреты в Docker-образах.
• Использовать тома для постоянного хранения данных.
Подготовили шпаргалку по Docker для продакшена: архитектура, команды, примеры, сети, тома, Compose и советы по диагностике проблем.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Почему один и тот же Java-файл
Секрет не в самом языке Java, а в JVM. Вот какой путь проходит программа:
Именно этот дополнительный уровень абстракции даёт Java её знаменитую возможность: «Написал один раз — запускай где угодно». Когда понимаешь эту цепочку, разобраться в JIT-компиляции, сборке мусора и настройке JVM становится гораздо проще.
Как думаете, почему Java использует промежуточный байткод, а не компилируется сразу в машинный код?
👉 Java Portal
.class запускается на Windows, Linux и macOS без перекомпиляции?Секрет не в самом языке Java, а в JVM. Вот какой путь проходит программа:
Hello.java → javac → Hello.class (байткод) → JVM → машинный код → выполнение программыИменно этот дополнительный уровень абстракции даёт Java её знаменитую возможность: «Написал один раз — запускай где угодно». Когда понимаешь эту цепочку, разобраться в JIT-компиляции, сборке мусора и настройке JVM становится гораздо проще.
Как думаете, почему Java использует промежуточный байткод, а не компилируется сразу в машинный код?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👀1