Секреты Java
Kanalga Telegram’da o‘tish
Обсуждаем Java, архитектуру, фреймворки и всё, о чем должны говорить разработчики. Владелец: @Alexey_Morl Реклама на бирже: https://telega.in/c/java_secrets
Ko'proq ko'rsatish7 991
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kunlar
Ma'lumot yo'q30 kunlar
Postlar arxiv
7 991
Присоединяйтесь к нашему бесплатному курсу и начните увлекательное путешествие в мир Java!
Изучайте основы, создавайте программы, разбирайтесь с методами и анализируйте ошибки в коде. Практика, упражнения и проверочные тесты помогут вам освоить навыки программирования.
🎓 Чему вы научитесь:
— Создавать программы с использованием основных конструкций языка.
— Разделять код на методы для повторного использования.
— Анализировать ошибки в коде с использованием отладочной печати.
💼 Включено в курс:
29 уроков (видео и/или текст), 35 упражнений в тренажере, 95 проверочных тестов + дополнительные материалы.
Вы с нами?😉
7 991
✅ Варианты конкатенации строк
В Java существует несколько способов конкатенации строк, каждый из которых имеет свои особенности и области применения. Рассмотрим основные методы:
▫️Оператор "+"
Самый простой и интуитивно понятный способ.
var result = "Hello" + " " + "World";
При таком подходе в пуле строк каждый раз создается новая строка. Простой, но не самый эффективный способ, когда происходит множество конкатенаций.
▫️StringBuilder
Является более эффективным способом конкатенации строк, особенно в циклах или при частом изменении строк.
var sb = new StringBuilder("Hello");
sb.append(" ");
sb.append("World");
sb.toString(); // Hello World
Но такой вариант не потокобезопасен.
▫️StringBuffer
Работает аналогично StringBuilder, но он синхронизирован и, следовательно, потокобезопасен.
var sb = new StringBuffer("Hello");
sb.append(" ");
sb.append("World");
sb.toString(); // Hello World
Но потокобезопасноть идет в ущерб производительности по сравнению со StringBuilder.
▫️String.concat()
var str = "Hello";
var result = str.concat(" ").concat("World"); // Hello World
Помните, что оригинальная строка не меняется! Производительнее оператора "+", принимает параметром только String. В отличии от "+" при аргументе null кидает NPE.
▫️String.join()
Позволяет конкатенировать строки с использованием разделителя (в примере первый аргумент).
var result = String.join(" ", "Hello", "World"); // Hello World
Следующие аргументы - последовательность! Т.е. можете передать несколько параметров, или закинуть массив. Лучше использовать когда есть массив строк, чем конкатенировать их в цикле.
▫️String.format()
Позволяет форматировать строки с помощью шаблонов, что может сделать код более читабельным.
var str1 = "Hello";
var str2 = "World";
var result = String.format("%s %s", str1, str2); // Hello World
Меньшая производительность по сравнению с другими методами и более сложный синтаксис для простых задач.
Выбор метода, конечно, зависит от конкретных задач и требований.
🫡 Секреты Java
#java #string7 991
Когда там восстание машин? 🤖
Эксперты с каждый днём все больше волнуются из-за нейросетей: как бы они не вышли из под контроля. И не зря.
Те, что читают Гаджетную, в курсе всех новостей из мира технологий, а кто владеет информацией - тот владеет миром.
💎Полезные сервисы для работы, тренды, новые профессии - без этого теперь никуда.
И да, о восстании машин мы сообщим раньше всех - https://t.me/+oYh5s591YuI1Y2Ji
7 991
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.© Линус Торвальдс От себя: большинство хороших и исключительно все лучшие. 🫡 Секреты Java #quotes
7 991
Оплачиваемая стажировка и трудоустройство без опыта — ну ничего себе 😳
Все возможно с Добровольным квалификационным экзаменом! Это бесплатный проект Правительства Москвы, где ты можешь показать свои знания по специальности, запомниться потенциальным работодателям и получить оффер в престижные компании Москвы.
Тебя ждет всего три шага:
1️⃣ Пройди тест
После регистрации на сайте ДКЭ тебе будет доступно 70 профессий по 7 направлениям. Выбирай тест по своей специальности и проверь уровень своих знаний!
2️⃣ Реши кейс
Если ты успешно сдал тест, тебя пригласят на следующий этап, где ты с другими участниками в команде будешь решать реальный кейс одного из работодателей.
3️⃣ Стань победителем
Окажись в числе лучших по общему количеству баллов за оба этапа и получи шанс попасть на оплачиваемую стажировку с дальнейшим трудоустройством.
Готов проявить себя? Регистрируйся и начинай проходить тест — https://dke.moscow
Реклама. АНО "РАЗВИТИЕ ЧЕЛОВЕЧЕСКОГО КАПИТАЛА", АНО "РЧК". ИНН 7710364647. erid: LjN8KB6nL
7 991
✅ Open-Closed Principle
Принцип открытости-закрытости (один из принципов SOLID) был сформулирован Бертраном Мейером в 1988 году:
Программные сущности должны быть открыты для расширения и закрыты для измененияА если переформулировать этот принцип, то можно сказать - если расширение функционала требует существенных изменений уже существующего рабочего кода, значит ваша архитектура трещит по швам. Это, возможно, самый основной принцип построения надежной архитектуры, но и четкого критерия, что вот это сервис спроектирован с учетом OCP, тут нет. И по правде говоря, мы не сможем на 100% закрыть систему от изменений, но должны свести необходимость этих изменений к минимуму. Как? Тут на помощь приходят SRP - мы разделяем модули, которые меняются по разным причинам, и DIP - мы правильно организуем зависимости между ними. Расширение - это не столько про наследование, это про отделение абстракций от деталей реализации. Vertical Sliced Architecture, паттерны Listener, Strategy и другие - это все инструменты нам в помощь. Можете себе представить работу системе, где код бизнес-логики зависел бы от протоколов интеграций, от способов ввода/вывода, от реализации бд? Небольшое изменение в какой-либо части приложение приведет к необходимости каскадных изменений по всей системе. Глянем на небольшой пример:
public class Reporter {
public void makeReport() {
Data data = getDataFromDb();
Report report = generateReport(data);
print(report);
}
private Data getDataFromDb() {...}
private Report prepareReport(Data data) {...}
private void print(Report report) {...}
}
Реализация методов сейчас не важна.
А теперь подумайте:
Что если бизнесу, помимо печати, нужно будет этот отчет еще и в JSON на другом сервисе?
Что если получать данные мы начнем не из бд?
Что если на основании этих данных попросят формировать отчет и с другим набором полей для другого отдела?
И что если сущность этого отчета потребуется в другой части приложения?
Что бы вы изменили в этом коде?
🫡 Секреты Java
#solid7 991
✅ Open-Closed Principle
Принцип открытости-закрытости (один из принципов SOLID) был сформулирован Бертраном Мейером в 1988 году:
Программные сущности должны быть открыты для расширения и закрыты для измененияА если переформулировать этот принцип, то можно сказать - если расширение функционала требует существенных изменений уже существующего рабочего кода, значит ваша архитектура трещит по швам. Это, возможно, самый основной принцип построения надежной архитектуры, но и четкого критерия, что вот это сервис спроектирован с учетом OCP, тут нет. И по правде говоря, мы не сможем на 100% закрыть систему от изменений, но должны свести необходимость этих изменений к минимуму. Как? Тут на помощь приходят SRP - мы разделяем модули, которые меняются по разным причинам, и DIP - мы правильно организуем зависимости между ними. Расширение - это не столько про наследование, это про отделение абстракций от деталей реализации. Vertical Sliced Architecture, паттерны Listener, Strategy и другие - это все инструменты нам в помощь. Можете себе представить работу системе, где код бизнес-логики зависел бы от протоколов интеграций, от способов ввода/вывода, от реализации бд? Небольшое изменение в какой-либо части приложение приведет к необходимости каскадных изменений по всей системе. Глянем на небольшой пример:
public class Reporter {
public void makeReport() {
Data data = getDataFromDb();
Report report = generateReport(data);
print(report);
}
private Data getDataFromDb() {...}
private Report prepareReport(Data data) {...}
private void print(Report report) {...}
}
Реализация методов сейчас не важна.
А теперь подумайте:
Что если бизнесу, помимо печати, нужно будет этот отчет еще и в JSON на другом сервисе?
Что если получать данные мы начнем не из бд?
Что если на основании этих данных попросят формировать отчет и с другим набором полей для другого отдела?
И что если сущность этого отчета потребуется в другой части приложения?
Что бы вы изменили в этом коде?
🫡 Секреты Java
#solid7 991
✅ Использование
@BatchSize для решения проблемы N+1 запроса в Hibernate
В Hibernate проблема N+1 запроса возникает, когда выполняется один запрос для получения основного набора данных, а затем N дополнительных запросов для загрузки связанных данных. Это может сильно замедлить производительность приложения. Один из способов решения этой проблемы — использование аннотации @BatchSize.
Аннотация @BatchSize позволяет указать размер партии (batch size) для загрузки связанных сущностей. Вместо выполнения множества отдельных запросов Hibernate будет загружать связанные сущности партиями, что значительно уменьшает количество запросов к базе данных.
На примере из поста про проблему N+1 запроса:
Если мы дополнительно пометим нашу связанную коллекцию аннотацией @org.hibernate.annotations.BatchSize (специально указал пакет - эта аннотация библиотеки Hibernate):
@Entity
public class Author {
@Id
private Long id;
private String name;
@BatchSize(size=5)
@OneToMany(mappedBy = "author", fetch = FetchType.EAGER)
private List<Book> books;
}
то в этом случае Hibernate будет загружать связанные книги партиями по 5 штук за один запрос и мы получим 2 запроса (с таким заполнением таблиц):
Hibernate: select a1_0.id,a1_0.name from authors a1_0
Hibernate: select b1_0.author_id,b1_0.id,b1_0.title from books b1_0 where b1_0.author_id = any (?)
Как это работает?
▫️Запрос загрузит всех авторов из базы данных.
▫️Запрос книг - вместо того, чтобы выполнять отдельный запрос для каждого автора, Hibernate выполнит запросы по 5 списков книг за раз (используя SQL конструкцию = ANY - эквивалент IN(...))
Т.е. если бы у нас было 20 авторов в бд, то при @BatchSize(size=5) мы выполнили бы 1 + (20/5) запрос, вместо 1 + 20;
Использование аннотации @BatchSize — это простой и эффективный способ решить проблему N+1 запроса в Hibernate. Однако, важно выбирать размер партии, соответствующий вашему сценарию использования и нагрузке на базу данных, чтобы избежать чрезмерного потребления ресурсов.
🫡 Секреты Java
#hibernate #jpa #nplus17 991
Хочешь практиковать Java на реальных задачах? В поисках оригинального контента, а не копипаста из других источников?
👉 Заходи на новый канал 👈
Топовые задачи:
— Много вопросов по concurrency и jvm
— Разбираем стандартные ошибки и их решения
— Оптимизируем код
— Best practices
— Задачи с реальных собеседований
— Разный уровень сложности
— Подробный разбор каждого решения
Достойный материал для подготовки к собеседованиям, а также сложные и интересные задачи из реальной практики.
Автор канала – Java-эксперт, более 10 лет в разработке. Опытный Lead dev и тимлид.
👉 Подписывайся и попробуй решить последнюю задачу! https://t.me/java_interview_tasks
7 991
Мечтаешь об успешной карьере в Java-разработке, но не знаешь, с чего начать ❓
Прокачайся бесплатно в ИТ-лагере T1.Дебют!
🌟 Приглашаем студентов и выпускников всей страны в ИТ-лагерь — это новый образовательный интенсив для Java-разработчиков от Холдинга Т1 — крупнейшей ИКТ-компании в России по версии RAEX 2023.
ИТ-лагерь проходит в два этапа: 1 месяц онлайн-обучения и неделя летнего атмосферного офлайн-буткемпа! ☀️
Гибкий формат позволяет совмещать обучение в ИТ-лагере со сдачей сессии или работой.
Финалисты получат сертификат на оплачиваемую стажировку, а лучших выпускников с опытом сразу пригласят в команду Т1.
🗓 Подай заявку до 31 мая
Реклама. ООО "Т1". ИНН 7720484492.
