Java | Фишки и трюки
Відкрити в Telegram
Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg
Показати більше6 811
Підписники
-624 години
-137 днів
-6930 день
Архів дописів
6 812
⌨️ Double-brace инициализация - техника создания и инициализации коллекций в одном выражении, используя анонимный внутренний класс.
✅ Пример:
List<String > planets = new ArrayList<>() {{
add ("Mercury");
add ("Venus");
add ("Earth");
add ("Mars");
add ("Jupiter");
add ("Saturn");
add ("Uranus") ;
add ("Neptune");
}};
✅Преимущества:
1. Краткость
2. Читаемость
3. Удобство для небольших коллекций
🚫Недостатки:
1. Создание анонимного класса (увеличение потребления памяти)
2. Скрытая ссылка (возможные утечки памяти)
3. Ограничения с final классами
4. Несовместимость с оператором diamond
5. Потенциальное влияние на производительность
6. Считается антипаттерном
🔻Альтернативы:
1. ☕️Java 8 Stream API:
List<String> planets = Stream.of("Mercury", "Venus", "Earth")
.collect(Collectors.toList());
2. ☕️Java 9+:
List<String> planets = List.of("Mercury", "Venus", "Earth");
3.🖨Конструктор копирования:
List<Integer> list = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(2, 3, 5)));
Несмотря на удобство, double-brace инициализация считается антипаттерном из-за проблем с производительностью и возможных утечек памяти.6 812
Научись писать код для работы с базами данных на уровне Senior+
Тестируешь на Java и до сих пор не знаешь, как эффективно работать с JDBC, PreparedStatement и Connection Pooling?
Приходи на открытое занятие Java для продвинутых.
Автор программы, Дмитрий Тучс, Head of QA в Dodo Engineering, спикер Codefest, Codetalks, EpicHey!, ментор и open-source контрибьютор — собрал все важное на курсе Java Advanced.
Ты научишься:
👉 Писать чистый и эффективный код с JDBC API
👉 Использовать PreparedStatement правильно и безопасно
👉 Разбираться в Connection Pooling и оптимизировать производительность тестов
👉 Избегать типичных ошибок при работе с БД
Ждем тебя на открытом уроке завтра в 20:00 (МСК).
🔗 Зарегистрируйся по ссылке.
6 812
Научись писать код для работы с базами данных на уровне Senior+
Тестируешь на Java и до сих пор не знаешь, как эффективно работать с JDBC, PreparedStatement и Connection Pooling?
Приходи на открытое занятие Java для продвинутых.
Автор программы, Дмитрий Тучс, Head of QA в Dodo Engineering, спикер Codefest, Codetalks, EpicHey!, ментор и open-source контрибьютор — собрал все важное на курсе Java Advanced.
Ты научишься:
👉 Писать чистый и эффективный код с JDBC API
👉 Использовать PreparedStatement правильно и безопасно
👉 Разбираться в Connection Pooling и оптимизировать производительность тестов
👉 Избегать типичных ошибок при работе с БД
Ждем тебя на открытом уроке завтра в 20:00 (МСК).
🔗 Зарегистрируйся по ссылке.
6 812
⌨️ Diamond-оператор (
<>) упрощает работу с обобщениями (Generics), позволяя компилятору автоматически выводить тип.
➡️ До Java 7 (без <>):
List<String> list = new ArrayList<String>(); // Приходилось дублировать <String>
➡️ С Java 7+ (с <>):
List<String> list = new ArrayList<>(); // Компилятор сам выводит <String>
Преимущества <>:
✅ Уменьшает дублирование кода
✅ Улучшает читаемость
✅ Работает с любыми обобщёнными классами
⚡ Итог: Diamond-оператор делает код чище и проще, автоматизируя вывод типов!6 812
Привет, ребята!
1,5 года я учился на программиста, а сайт easyoffer.ru стал моим пет-проектом. Я создавал его, потому что:
а) нужно было добавить хоть какой-нибудь проект в резюме
б) подготовиться к прохождению собесов
И всё получилось! Благодаря еasyoffer я успешно прошёл собеседование и устроился Junior-разработчиком на удаленку с зарплатой 115 тысяч рублей.
Однако ещё во время разработки я понял, что у этого проекта есть потенциал. Казалось, что сайт может стать популярным и, возможно, превратится в стартап. Результат превзошёл ожидания! С момента запуска easyoffer посетило 400 тысяч человек и я принял решение уйти с работы, чтобы полностью посвятить себя разработке новой версии сайта.
Уже год я работаю над easyoffer 2.0.
Это будет более масштабный и качественно новый проект:
– Появятся задачи из собеседований и вероятность их встретить
– Фильтрация по компаниям, можно будет готовиться к собесу в конректную компанию
– Появится тренажер для подготовки к вопросам на собеседовании
– А также тренажер "Реальное интервью", со стеком вопросов отдельных компаний.
– В рейтинге вопросах с собеседований появится фильтрация по грейду и типу интревью (Техничкое/HR-скрининг)
И еще очень много фич, о которых я расскажу позже.
Хочу, довести easyoffer до ума, чтобы сайт стал настоящим помощником для всех, кто готовится к собеседованиям. По этому уже на этой неделе я объявлю о старте краудфандинговой кампании, чтобы ускорить разработку. Все кто поддержит проект до официального релиза получат самые выгодные условия пользования сервисом. А именно 1 год доступа к сайту по цене месячной подписки.
‼️ Очень важно, чтобы как можно больше людей поддержали проект в первые дни, по-этому те кто окажет поддержку первыми получат еще более выгодную цену на годовую подписку и существенный бонус 💎 Подписывайтесь на этот телеграм канал, чтобы узнать о старте проекта раньше других и воспользоваться лимитированными вознаграждениями.
6 812
⌨️ Какой хеш-код имеет
null?
null не имеет хеш-кода, потому что null не является объектом. Однако, при использовании null в структурах данных, таких как HashMap или HashSet, применяется специальная логика:
➡️ Что происходит с null в HashMap и HashSet?
✔️ В HashMap ключ null всегда попадает в первый бакет (bucket 0).
✔️ В HashSet (который использует HashMap внутри) null также хранится в этом же бакете.
✔️ Проверки выполняются в Objects.hashCode(), который для null всегда возвращает 0.
➡️ Пример:
System.out.println(Objects.hashCode(null)); // 0
📌 Вывод: null не имеет собственного хеш-кода, но в хеш-структурах ему назначается 0.6 812
Внимание, программисты!
День рождение у автора DMdev - а подарок у вас!
Праздничная распродажа на все 13 курсов по Java от DMdev
👇
Только сегодня 14.999 rub 4.999 rub с доступом на год.
Каждый, кто успеет записаться, получит не только доступ к мега-курсам, но и шикарный подарок — участие в закрытом вебинаре "Микросервисы" 🎁
И это еще не всё!
Также будут разыграны три крутых приза, которые могут стать твоими!
Время тик-такает!
Жмите на ссылку и погружайтесь в Java программирование с DMdev!
6 812
Varargs (Variable Arguments List, изменяющийся список аргументов) — это способ создания методов, которые могут принимать произвольное количество аргументов одного типа (от нуля и более). Данная возможность появилась в JDK 5.
Запись вида
Object... args и есть varargs.
При этом три точки после типа указывают, что метод в качестве аргумента может принимать как массив, так и любую последовательность аргументов, записанных через запятую, которая все равно преобразуется в одномерный массив - «под капотом» компилятор на уровне байт-кода неявно заменяет переданную последовательность массивом. Уже в методе аргумент varargs используется как одномерный массив.
Альтернативой varargs является перегрузка методов или передача в метод массива значений.
Varargs был создан с целью упрощения работы программиста, удобства и краткости кода.
📌 В качестве ограничения любой метод может использовать varargs только в единственном числе и строго последним аргументом.6 812
⚡️Слита База из 1000+ топовых курсов и материалов для айтишников
🖥 Python: @python_baza
👩💻 Frontend: @frontend_baza
👩💻 Backend: @backend_baza
🎨 Дизайн: @design_baza
📚 Книги: @archive_baza
👩💻 Все языки: @main_it_baza
Всё лучшее про IT бесплатно — уже на Базе 🚀
6 812
☕️ Возвращение пустых коллекций вместо
null
Возвращение пустых коллекций вместо null-это рекомендуемый подход для методов, возвращающих коллекции. Он упрощает обработку данных, предотвращает ошибки и делает код более предсказуемым.
✅ Преимущества
1. Улучшение читаемости: Код становится проще, так как не нужно проверять результат на null.
2. Предотвращение NullPointerException: Исключается вероятность ошибок, связанных с доступом к null.
3.Соответствие принципу наименьшего удивления: Методы всегда возвращают коллекцию, даже если она пуста.
4. Эффективность: Пустые коллекции создаются один раз и переиспользуются благодаря реализации через паттерн Singleton.
5. Совместимость с функциональным программированием: Пустые коллекции легко интегрируются в стримы и другие функциональные конструкции.
Пример:
public class CacheService {
private final Map<String, List<Object>> cache = new ConcurrentHashMap<>();
public List<Object> getCachedValues(String key) {
return cache.getOrDefault(key, Collections.emptyList());
}
public void addToCache(String key, Object value) {
cache.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
}
}
❗️ Метод Collections.emptyList() является частью стандартной библиотеки Java (java.util.Collections). Он реализован через паттерн Singleton для повышения эффективности и безопасности.
Использование пустых коллекций вместо null делает код более устойчивым и предсказуемым. Это особенно важно в сложных многопоточных приложениях или системах с большим количеством взаимосвязанных компонентов.6 812
Сливаем вам 2 архива на 500 курсов!
➤ Backend и языки программирования:
- Python
- REST
- Java
- PHP
- Go
- SQL
- NoSQL
- C#
- C++
- Rust
- JavaScript
- Другое
➤ Frontend и Web-дизайн:
- JavaScript
- Figma
- Web-Дизайн
- HTML/CSS
- Верстка
- UI/UX
- Другое
6 812
⌨️ Почему String неизменяемый класс?
Есть несколько преимуществ в неизменности строк:
✔️ Пул строк возможен только потому, что строка неизменяемая, таким образом виртуальная машина сохраняет больше свободного места в Heap, поскольку разные строковые переменные указывают на одну и ту же переменную в пуле. Если бы строка была изменяемой, то интернирование строк не было бы возможным, потому что изменение значения одной переменной отразилось бы также и на остальных переменных, ссылающихся на эту строку.
✔️ Если строка будет изменяемой, тогда это станет серьезной угрозой безопасности приложения. Например, имя пользователя базы данных и пароль передаются строкой для получения соединения с базой данных и в программировании сокетов реквизиты хоста и порта передаются строкой. Так как строка неизменяемая, её значение не может быть изменено, в противном случае злоумышленник может изменить значение ссылки и вызвать проблемы в безопасности приложения.
✔️ Неизменяемость позволяет избежать синхронизации: строки безопасны для многопоточности и один экземпляр строки может быть совместно использован различными потоками.
✔️ Строки используются classloader и неизменность обеспечивает правильность загрузки класса.
✔️ Поскольку строка неизменяемая, её hashCode() кэшируется в момент создания и нет необходимости рассчитывать его снова. Это делает строку отличным кандидатом для ключа в HashMap т.к. его обработка происходит быстрее.
#java #string #immutable
6 812
QA.GURU | GraphQL 📱
Прокачайся в JAVA автоматизации на открытых вебинарах от Head of QA
🫢 Загляни под капот автотестов GraphQL, разберись в тонкостях микросервисной архитектуры и на практике узнай, как подменять настоящие микросервисы Wiremock-ом.
Об этом и многом другом говорим на занятиях для продвинутых.
👉 Заходи в @qa_guru >>>
👉 Заходи в @qa_guru >>>
Здесь ты найдешь анонсы ближайших открытых занятий нашей школы и полезные материалы от опытных инженеров.
Решаешь интересный кейс?
Обратись за помощью в открытый чат сообщества. Мы любим сложные задачи.
20 марта ждем тебя на открытом вебинаре по Java для продвинутых.
🔗 Зарегистрируйся за минуту >>>
6 812
⌨️ Чем отличается процесс от потока?
Процесс — экземпляр программы во время выполнения, независимый объект, которому выделены системные ресурсы (например, процессорное время и память). Каждый процесс выполняется в отдельном адресном пространстве: один процесс не может получить доступ к переменным и структурам данных другого. Если процесс хочет получить доступ к чужим ресурсам, необходимо использовать межпроцессное взаимодействие. Это могут быть конвейеры, файлы, каналы связи между компьютерами и многое другое.
Для каждого процесса ОС создает так называемое «виртуальное адресное пространство», к которому процесс имеет прямой доступ. Это пространство принадлежит процессу, содержит только его данные и находится в полном его распоряжении. Операционная система же отвечает за то, как виртуальное пространство процесса проецируется на физическую память.
Поток(thread) — определенный способ выполнения процесса, определяющий последовательность исполнения кода в процессе. Потоки всегда создаются в контексте какого-либо процесса, и вся их жизнь проходит только в его границах. Потоки могут исполнять один и тот же код и манипулировать одними и теми же данными, а также совместно использовать описатели объектов ядра, поскольку таблица описателей создается не в отдельных потоках, а в процессах. Так как потоки расходуют существенно меньше ресурсов, чем процессы, в процессе выполнения работы выгоднее создавать дополнительные потоки и избегать создания новых процессов.
#java #process #thread
6 812
⭐️🚀 Смарт-контракты управляют миллионами транзакций в мире блокчейна. Хотите научиться их разрабатывать?
Solidity — ключевой язык программирования для создания децентрализованных приложений. Разбираем, как написать, задеплоить и протестировать смарт-контракт.
После открытого вебинара вы сможете создать свой первый контракт, поймёте принципы работы Solidity и подготовитесь к профессиональному росту в Web3-разработке.
⏰ Встречаемся 19 марта в 20:00 мск! Участники получат скидку на большое обучение «Solidity Developer».
👉 Для участия зарегистрируйтесь https://otus.pw/PmAj/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
6 812
👾Захват стека вызовов через StackWalker
🔸StackWalker, введенный в Java 9, предоставляет эффективный способ работы с текущим стеком вызовов. Это мощный инструмент для логирования, отладки и анализа производительности.
✅Основные преимущества StackWalker:
1. 🟢Эффективность: StackWalker использует ленивую загрузку фреймов стека.
2. 🟢Гибкость: API предоставляет различные методы для работы со стеком.
3. 🟢Настраиваемость: Можно указать, какие фреймы включать в обход.
🟣Пример использования StackWalker:
public class StackWalkerExample {
public static void main(String[] args) {
method1();
}
private static void method1() {
method2();
}
private static void method2() {
method3();
}
private static void method3() {
StackWalker walker = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE);
walker.forEach(frame -> {
System.out.println("Класс: " + frame.getClassName() +
", Метод: " + frame.getMethodName() +
", Строка: " + frame.getLineNumber());
});
}
}
Более сложный пример с фильтрацией и обработкой стека:
public class AdvancedStackWalkerExample {
public static void main(String[] args) {
logMethodCall();
}
private static void logMethodCall() {
StackWalker walker = StackWalker.getInstance(EnumSet.of(
StackWalker.Option.RETAIN_CLASS_REFERENCE,
StackWalker.Option.SHOW_REFLECT_FRAMES
));
List callStack = walker.walk(stream ->
stream.filter(frame -> !frame.getClassName().startsWith("java.lang"))
.map(frame -> frame.getClassName() + "." + frame.getMethodName())
.limit(5)
.collect(Collectors.toList())
);
System.out.println("Стек вызовов (до 5 методов, исключая java.lang):");
callStack.forEach(System.out::println);
}
}
В заключение, StackWalker предоставляет мощный и эффективный способ работы со стеком вызовов, улучшая производительность и гибкость кода.6 812
⚡ Когда мне говорят, что Java слишком простой язык, я показываю канал Java Learning
Здесь я научился:
▪️ Разрабатывать высоконагруженные серверные приложения
▪️ Управлять сложными базами данных
▪️ Организовывать эффективную многопоточную обработку данных
▪️ Проходить технические собеседования в ведущие IT-компании
Самый необычный канал про Java, подписывайся – @Java_per_month
6 812
⌨️ Что же это такое Records и sealed classes?
🔹Комбинация records и sealed classes позволяет создавать строгие и безопасные модели данных с ограничениями на наследование. Это особенно полезно при реализации доменных моделей.
Records, введенные в Java 14, предоставляют лаконичный способ создания неизменяемых классов данных. Sealed classes, появившиеся в Java 17, позволяют ограничивать наследование.
🫥 Пример реализации системы управления платежами:
public sealed interface PaymentMethod permits CreditCard, BankTransfer, PayPal {
boolean isValid();
void process();
}
public record CreditCard(String cardNumber, String expiryDate, String cvv) implements PaymentMethod {
@Override
public boolean isValid() {
return cardNumber != null && cardNumber.length() == 16
&& expiryDate != null && cvv != null;
}
@Override
public void process() {
System.out.println("Processing credit card payment");
}
}
public record BankTransfer(String accountNumber, String bankCode) implements PaymentMethod {
@Override
public boolean isValid() {
return accountNumber != null && bankCode != null;
}
@Override
public void process() {
System.out.println("Processing bank transfer");
}
}
public record PayPal(String email) implements PaymentMethod {
@Override
public boolean isValid() {
return email != null && email.contains("@");
}
@Override
public void process() {
System.out.println("Processing PayPal payment");
}
}
public record Payment(UUID id, BigDecimal amount, PaymentMethod method) {
public boolean processPayment() {
if (method.isValid()) {
method.process();
return true;
}
return false;
}
}
➕Преимущества:
1. Типобезопасность: Компилятор гарантирует, что только определенные классы могут реализовывать PaymentMethod.
2. Неизменяемость: Records обеспечивают неизменяемость данных.
3. Краткость кода: Records автоматически генерируют методы.
Пример использования:
public void handlePayment(Payment payment) {
if (payment.processPayment()) {
switch (payment.method()) {
case CreditCard cc -> handleCreditCardPayment(cc);
case BankTransfer bt -> handleBankTransferPayment(bt);
case PayPal pp -> handlePayPalPayment(pp);
}
} else {
handleFailedPayment(payment);
}
}
Этот подход особенно полезен для моделирования бизнес-доменов и реализации паттерна "Состояние".
Он позволяет создавать более безопасный и поддерживаемый код.6 812
Эффективная разработка на Spring Boot без ограничений.
Пока зарубежные компании отзывают лицензии у пользователей РФ, Amplicode продолжает помогать максимально удобно работать со Spring Boot, JPA, Docker, Kafka, Liquibase, MapStruct и т.д.
Amplicode можно установить как плагин в IntelliJ IDEA Community и Ultimate, а также в Giga IDE.
Что умеет Amplicode?
⚡ Легкая навигация по проекту
⚡ Создание объектов сразу в терминах фреймворка: контроллеры, репозитории, сервисы, сущности, события, DTO, мапперы и т.д.
⚡ Палитра и инспектор, позволяющие видеть опции, доступные разработчику в текущем контексте
⚡ Умные инжекции, подсказки и исправление ошибок
⚡ и многое другое!
А самое главное, Amplicode доступен бесплатно и без региональных ограничений!
Познакомьтесь со всеми возможностями Amplicode
Читайте наш гайд: «Как превратить IntelliJ IDEA Community Edition в Ultimate за 3 простых шага»
#реклама
О рекламодателе
