Java Geek
2.39K subscribers
285 photos
1 file
39 links
Практичные советы, лайфхаки и код для Java-разработчиков. Каждый пост — реальная польза. Учим Java на примерах.

По всем вопросам @evgenycarter
Download Telegram
👩‍💻 Как работает @Transactional в Spring: границы транзакций и типовые ошибки

Приглашаем на открытый урок.

🗓 29 июня в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Разработчик на Spring Framework».

На занятии мы разберем:
✔️Что реально делает @Transactional в Spring
✔️Почему важны proxy и вызов метода через Spring Bean
✔️Как работают propagation-режимы на примере REQUIRED и REQUIRES_NEW
✔️Когда происходит rollback и почему checked exceptions не всегда откатывают транзакцию
✔️Типовые ошибки при работе с транзакциями в сервисном слое

Урок будет полезен Java/Kotlin-разработчикам, которые уже пишут приложения на Spring или начинают использовать Spring в реальных backend-проектах и хотят лучше понимать поведение транзакций.

🔗 Ссылка на регистрацию: https://vk.cc/cYRHlf

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Что такое «fail-fast поведение»?

fail-fast поведение означает, что при возникновении ошибки или состояния, которое может привести к ошибке, система немедленно прекращает дальнейшую работу и уведомляет об этом. Использование fail-fast подхода позволяет избежать недетерминированного поведения программы в течение времени.

В Java Collections API некоторые итераторы ведут себя как fail-fast и выбрасывают ConcurrentModificationException, если после его создания была произведена модификация коллекции, т.е. добавлен или удален элемент напрямую из коллекции, а не используя методы итератора.

Реализация такого поведения осуществляется за счет подсчета количества модификаций коллекции (modification count):

• при изменении коллекции счетчик модификаций так же изменяется;
• при создании итератора ему передается текущее значение счетчика;
• при каждом обращении к итератору сохраненное значение счетчика сравнивается с текущим, и, если они не совпадают, возникает исключение.

👉 @java_geek
👍2
Дайте краткую характеристику Enum в Java

Enum — перечисление, набор строковых констант, объединенных общим типом. Объявляется через ключевое слово — enum.

Вот пример с enum — допустимые роли в некоторой школе (см картинку).

Слова, написанные большими буквами, и есть те самые константы перечисления, которые объявляются упрощенно, без использования оператора new.

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

👉 @java_geek
👍1
👩‍💻 Алгоритмическая сложность коллекций в Java

Приглашаем на открытый урок.

🗓 01 июля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java-разработчик».

Программа урока:
✔️Основы алгоритмической сложности и принцип работы о-нотации;
✔️Влияние сложности операций на выбор подходящих коллекций;
✔️Сравнение популярных коллекций Java по эффективности выполнения различных операций;
✔️Практическая демонстрация, в которой будет показано, как эффективно использовать коллекции;
✔️Рекомендации по выбору коллекций для решения задач разного уровня сложности.

🔗 Ссылка на регистрацию: https://vk.cc/cYZxl9

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Как определить, содержит ли массив определенное значение в Java с помощью потоков?

Чтобы проверить, содержит ли массив значений int, double или long значение, используйте IntStream, DoubleStream или LongStream соответственно.

👉 @java_geek
👍1
Pattern.asPredicate()

Pattern.asPredicate() превращает регулярное выражение в Predicate<String>, который можно использовать прямо в потоках (Stream). Это полезно для фильтрации строк без явного вызова .matches().

👉 @java_geek
👍3
🚀 Подборка полезных IT каналов в Max


Системное администрирование, DevOps 📌

https://max.ru/i_odmin Все для системного администратора
https://max.ru/bash_srv Bash Советы
https://max.ru/sysadminof Книги для админов, полезные материалы
https://max.ru/i_odmin_book Библиотека Системного Администратора
https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.
https://max.ru/tipsysdmin Типичный Сисадмин

Excel лайфхак 📌
https://t.me/Excel_lifehack Excel лайфхак

Английский с нуля 🇬🇧
https://max.ru/UchuEnglish

1C разработка 📌
https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С

Программирование C++📌
https://max.ru/cpp_lib Библиотека C/C++ разработчика

Программирование Go📌
https://max.ru/golang_lib Библиотека Go (Golang) разработчика

Программирование React📌
https://max.ru/react_lib React

Программирование Python 📌
https://max.ru/python_of Python академия.
https://max.ru/BookPython Библиотека Python разработчика

Java разработка 📌
https://max.ru/bookjava Библиотека Java разработчика

GitHub Сообщество 📌
https://max.ru/githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://max.ru/database_info Все про базы данных

Фронтенд разработка 📌
https://max.ru/frontend_1 Подборки для frontend разработчиков

Библиотеки 📌
https://max.ru/programmist_of Книги по программированию
https://max.ru/proglb Библиотека программиста
https://max.ru/bfbook Книги для программистов

Программирование 📌
https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций
https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT
https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻

Шутки программистов 📌
https://max.ru/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://max.ru/thehaking Канал о кибербезопасности
https://max.ru/xakkep_1 Хакер Free

Книги, статьи для дизайнеров 📌
https://max.ru/odesigners Статьи, книги для дизайнеров

Математика 📌
https://max.ru/Pomatematike Канал по математике
https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике

Вакансии 📌
https://max.ru/progjob Вакансии в IT

Мир технологий 📌
https://max.ru/mir_teh Канал для любознательных

Бонус 📌
https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга
https://max.ru/mockva_life Свежие новости Москвы
https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП
👎1
Что будет, если в static блоке кода возникнет исключение?

Если в static блоке кода возникнет исключение, то это приведет к ошибке инициализации класса.
Static блок выполняется при загрузке класса, и любые исключения в нем приведут к сбою и невозможности загрузить класс.

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

👉 @java_geek
👍2
Можно ли перегрузить static метод?

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

Например, можно создать статический метод sum, который будет складывать числа. Метод можно перегрузить, создав одну версию для сложения целых чисел (int), а другую — для сложения чисел с плавающей точкой (double).
При вызове метода компилятор будет выбирать нужную версию на основе типа аргументов.

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

👉 @java_geek
👍3
🔴 Завтра тестовое собеседование с Java-разработчиком

1 июля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
📂 Виктор Анохин, старший разработчик из WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Виктор будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Виктору

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир →
@shortcut_sh_bot

Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
1😱1
Что вернет выражение 1.0/0.0? Приведет ли оно к генерации исключения или ошибке при компиляции?

Еще один каверзный вопрос насчет класса Double. Хотя разработчики Java знают о существовании простого типа данных double и класса Double, при выполнении операций с плавающей точкой они не уделяют достаточного внимания Double.INFINITY, NaN, -0.0 и правилам, которым подчиняются связанные с ними арифметические вычисления.

Ответ на этот вопрос прост: генерации исключения ArithmeticException не произойдет, будет возвращено значение Double.INFINITY.

👉 @java_geek
👍1
Что такое каскадность? Как она используется в Hibernate?

Каскадность в Hibernate — это функция, которая позволяет автоматически распространять состояние сущности на связанные с ней сущности. Это означает, что когда мы выполняем определенное действие над целевой сущностью, то же самое действие будет применено к связанным с ней сущностям.

Например, если у нас есть отношение между сущностями Person и Address, и без сущности Person сущность Address не имеет смысла. Когда мы удаляем сущность Person, наша сущность Address также должна быть удалена. Каскадность — это способ достижения этого.

В JPA/Hibernate имеются различные типы каскадности, которые определяют, какие операции должны распространяться на связанные сущности. Например, CascadeType.ALL распространяет все операции от родительской сущности на дочернюю.

👉 @java_geek
👍2
👩‍💻 Стоит ли учить Java в 2026: куда движется язык и где работают джависты

Приглашаем на открытый урок.

🗓 16 июля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java-разработчик».

Программа урока:
✔️ Развенчиваем главный миф новичка: правда ли, что «Java умерла» и всем надо идти в Python или Go
✔️ Где Java реально работает в 2026: банки, финтех, маркетплейсы, стриминги с миллионами пользователей, логистика
✔️ Big Data на JVM: почему Kafka, Spark и Hadoop написаны на Java и зачем это знать даже питонисту
✔️ Куда движется язык: релизы каждые полгода, борьба с многословностью, нативная компиляция (GraalVM), связка с AI
✔️ Карьера джависта: зарплаты, стабильность и почему этот язык — фундамент для долгого пути в IT

🔗 Ссылка на регистрацию: https://vk.cc/cZlozX

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Почему метод clone объявлен как protected?

Метод clone() по умолчанию объявлен как protected, чтобы ограничить возможность клонирования объектов.
Если бы метод был public, то любой код мог бы клонировать объекты класса. А это не всегда желательно по соображениям безопасности и корректности программы.

С protected доступом клонирование разрешено только внутри класса и его наследников. Таким образом разработчик класса может сам решить, будет ли класс поддерживать клонирование и как именно оно будет реализовано в методе clone().

Делая клонирование protected по умолчанию, Java принуждает разработчика сознательно разрешить клонирование класса путем переопределения метода clone() как public в самом классе.
Это позволяет более гибко контролировать возможности клонирования в каждом конкретном классе.

👉 @java_geek
👍1
Расскажите о различиях вложенных классов: простых и статических?

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

Основные различия:

- Простой вложенный класс имеет доступ к членам внешнего класса, статический - нет.

- Для создания экземпляра простого вложенного класса нужен экземпляр внешнего класса, для статического - нет.

- Простой вложенный класс зависит от экземпляра внешнего класса, статический - нет.

👉 @java_geek
👍2🔥2
👩‍💻 Основы многопоточности в Java

Приглашаем на открытый урок.

🗓 23 июля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java-разработчик».

На уроке разберем:
✔️ Что такое поток выполнения и почему даже обычная Java-программа работает в главном потоке main.
✔️ Как создавать и запускать потоки через Thread и Runnable.
✔️ Зачем нужен join и как дождаться завершения запущенных потоков.
✔️ Почему многопоточность может ускорить программу, а может добавить лишние накладные расходы.
✔️ Какие типовые проблемы возникают в многопоточном коде: гонки, starvation и deadlock.

🔗 Ссылка на регистрацию: https://vk.cc/cZAF9K

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Зачем нужен HashMap, если есть Hashtable?

Методы класса Hashtable синхронизированы, что приводит к снижению производительности, а HashMap - нет;
HashTable не может содержать элементы null, тогда как HashMap может содержать один ключ null и любое количество значений null;
Iterator у HashMap, в отличие от Enumeration у HashTable, работает по принципу «fail-fast» (выдает исключение при любой несогласованности данных).

Hashtable это устаревший класс и его использование не рекомендовано.

👉 @java_geek
👍5
Что такое «сессия»?

Сессия — это сеанс связи между клиентом и сервером, устанавливаемый на определенное время. Сеанс устанавливается непосредственно между клиентом и веб-сервером в момент получения первого запроса к веб-приложению. Каждый клиент устанавливает с сервером свой собственный сеанс, который сохраняется до окончания работы с приложением.

📲 Мы в MAX

👉 @java_geek
👍1
🚀 Подборка полезных IT каналов в Max


Системное администрирование, DevOps 📌

https://max.ru/i_odmin Все для системного администратора
https://max.ru/bash_srv Bash Советы
https://max.ru/sysadminof Книги для админов, полезные материалы
https://max.ru/i_odmin_book Библиотека Системного Администратора
https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.
https://max.ru/tipsysdmin Типичный Сисадмин
https://max.ru/channel_win_sysadmin Системный Администратор Windows
https://max.ru/channel_linux_admin Linux: Системный администратор
https://max.ru/channel_linuxmod Linux
https://max.ru/channel_i_linux Системный администратор
https://max.ru/channel_devopslib DevOps, SRE, Sysadmin
https://max.ru/channel_devops_star DevOps Star (Звезда Девопса)

Excel лайфхак 📌
https://t.me/Excel_lifehack Excel лайфхак

Английский с нуля 🇬🇧
https://max.ru/UchuEnglish

1C разработка 📌
https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://max.ru/channel_DevLab1C 1С:Предприятие 8

Программирование C++📌
https://max.ru/cpp_lib Библиотека C/C++ разработчика
https://max.ru/channel_cpp_geek C++ geek

Программирование Go📌
https://max.ru/golang_lib Библиотека Go (Golang) разработчика

Программирование React📌
https://max.ru/react_lib React

Программирование Rust📌
https://max.ru/channel_rust_lib

Программирование Python 📌
https://max.ru/python_of Python академия.
https://max.ru/BookPython Библиотека Python разработчика

Java разработка 📌
https://max.ru/bookjava Библиотека Java разработчика
https://max.ru/channel_java_geek Java Geek

GitHub Сообщество 📌
https://max.ru/githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://max.ru/database_info Все про базы данных

Фронтенд разработка 📌
https://max.ru/frontend_1 Подборки для frontend разработчиков

Библиотеки 📌
https://max.ru/programmist_of Книги по программированию
https://max.ru/proglb Библиотека программиста
https://max.ru/bfbook Книги для программистов

Программирование 📌
https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций
https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT
https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻

Шутки программистов 📌
https://max.ru/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://max.ru/thehaking Канал о кибербезопасности
https://max.ru/xakkep_1 Хакер Free

Книги, статьи для дизайнеров 📌
https://max.ru/odesigners Статьи, книги для дизайнеров

Математика 📌
https://max.ru/Pomatematike Канал по математике
https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике

Вакансии в IT📌
https://max.ru/progjob
https://max.ru/channel_rabotait

Мир технологий 📌
https://max.ru/mir_teh Канал для любознательных

Бонус 📌
https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга
https://max.ru/mockva_life Свежие новости Москвы
https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП
🤡5
Что такое пул строк? Это набор строк, хранящийся в Heap.

Пул строк возможен благодаря неизменяемости строк в Java и реализации идеи интернирования строк;
Пул строк помогает экономить память, но по этой же причине создание строки занимает больше времени;
Когда для создания строки используются ", то сначала ищется строка в пуле с таким же значением, если находится, то просто возвращается ссылка, иначе создается новая строка в пуле, а затем возвращается ссылка на неё;
При использовании оператора new создаётся новый объект String. Затем при помощи метода intern() эту строку можно поместить в пул или же получить из пула ссылку на другой объект String с таким же значением;
Пул строк является примером паттерна «Приспособленец» (Flyweight).

📲 Мы в MAX

👉 @java_geek
👍2🔥2
🚀 Hibernate: Эффективное обновление с @DynamicUpdate

Часто ли вы задумывались, почему Hibernate при обновлении одного поля в сущности генерирует SQL-запрос, который включает все поля? Это может быть неэффективно, особенно для сущностей с десятками колонок.

Именно здесь на помощь приходит аннотация @DynamicUpdate!

💡 В чем проблема? (Без @DynamicUpdate)

По умолчанию, когда вы вызываете repository.save(entity) для существующей сущности, Hibernate генерирует UPDATE запрос, который устанавливает значения для всех полей, кроме первичного ключа.


// Without @DynamicUpdate
update employee
set
age=?, // даже если только age изменился
first_name=?, //... и это тоже
last_name=?
where
id=?


Если изменилось только age, остальные поля обновляются на те же значения, что были.

Решение: @DynamicUpdate(true)

Если вы добавите @DynamicUpdate к вашей сущности, Hibernate будет генерировать SQL-запрос UPDATE, который включает только те поля, которые были изменены (dirty-checking) с момента загрузки или создания сущности.

Смотрим на код:


@Entity
@DynamicUpdate // Добавляем эту аннотацию!
public class Employee extends AbstractPersistable<Long> {
@Column
String firstName;

@Column
String lastName;

@Column
Integer age;
// ...
}

// В EmployeeService:
// var entity = employeeRepository.findById(1L).get();
// entity.setAge(22); // Изменили только возраст
// employeeRepository.save(entity);


Сгенерированный SQL:


// With @DynamicUpdate
update employee
set
age=? // Обновляется ТОЛЬКО измененное поле
where
id=?


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

- Используйте, если у вас большие сущности (много колонок) и вы часто обновляете только небольшую часть полей. Это сэкономит трафик и немного ускорит базу данных.
- Имейте в виду, что Hibernate придется динамически строить SQL-запрос при каждом обновлении, что может добавить небольшой оверхед, но обычно выгода от оптимизации SQL его перевешивает.

Сделайте ваш код более чистым и эффективным! 🛠️


А вы используете @DynamicUpdate в своих проектах? Поделитесь в комментариях! 👇

P.S. Не путайте с @DynamicInsert, который делает то же самое для INSERT запросов (включает только не-null поля).

📲 Мы в MAX

👉 @java_geek
1👍1🔥1