Изучаем Java. По вопросам сотрудничества: @seniorvladislav
Вложенные классы
Вложенные классы (nested classes) представляют собой классы, объявленные внутри других классов. Вложенные классы могут быть статическими или нестатическими, и они могут использоваться для логической организации кода, повышения инкапсуляции и улучшения читаемости.
Статические вложенные классы (Static Nested Classes):
— Статический вложенный класс объявляется с использованием ключевого слова static.
— Он имеет доступ только к статическим членам внешнего класса и не имеет доступа к нестатическим членам.
— Статические вложенные классы используются, когда внутренний класс не зависит от экземпляра внешнего класса.
Внутренние классы (Inner Classes):
— Внутренние классы не объявляются с использованием ключевого слова static.
— Они имеют доступ ко всем членам внешнего класса, включая нестатические поля и методы.
— Внутренние классы могут быть обычными (обычные вложенные классы), анонимными или локальными.
#для_начинающих
RecursiveTask<V> RecursiveTask<V>
является частью фреймворка Fork/Join
в Java, введенного в Java 7. Этот фреймворк предоставляет удобный способ распараллеливания выполнения задач.RecursiveTask<V>
является подклассом ForkJoinTask<V>
. Он предназначен для использования вместе с пулом Fork/Join
(ForkJoinPool
) и предоставляет специальные методы для разделения задачи на подзадачи и объединения результатов.
#для_продвинутых
Приглашаем вас на открытый вебинар: «Основы многопоточности в Java»
⏰Дата: 25 декабря в 20:00 мск
Спикер: Борис Кириллов
📚Программа урока:
- Введение в многопоточность: что это и зачем это нужно.
- Изучение базовых классов для работы с потоками.
- Разбор типовых проблем многопоточности и подходов к их решению.
🔥Урок будет полезен тем, кто хочет:
- Разобраться в основах многопоточности в Java.
- Понять, как писать многопоточные программы.
- Узнать, какие классы используются для работы с потоками в Java.
🚀В результате урока вы:
- Поймете подходы к многопоточности в Java.
- Изучите базовые классы и синтаксис многопоточной обработки.
- Сможете применять полученные знания для создания более эффективных Java-приложений.
Участники всех открытых уроков получат скидку🎁 на большое обучение
👉Регистрируйтесь на открытый вебинар по ссылке: https://otus.pw/KDb4/Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Хватит разворачивать приложения наугад! Docker — must-have инструмент для современных Java-разработчиков.
🔍 На открытом уроке разберем, как контейнеризация упрощает разработку и развертывание приложений. Узнаете всё: от создания Docker-контейнеров до профилирования.
👉 Запускайте Java-приложения в облаке, тестируйте их под нагрузкой, отлаживайте с точностью хирурга. Начните путь к новой профессиональной высоте!
🗓 Запишитесь на урок «Контейнеризация Java-приложений с Docker» 27 декабря в 20:00 уже сейчас! Участникам — скидки на курс «Java Developer. Advanced»: https://otus.pw/X9YU/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Облако — это конструктор!
The Art of Programming — подкаст об инструментах, технике и разработке ПО. По следам конференции HighLoad 2024 записали новый выпуск, в котором обсуждаем индустрию публичных облаков.
Вместе с Данилой Дюгуровым, CTO MTC Web Services, говорим о новостях индустрии, создании новых облачных платформ, потенциале рынка и принципах формирования топовых команд разработки.
🎧Слушайте The Art of Programming на всех популярных подкаст-площадках.
⚙️ String.format()
В Java метод String.format()
позволяет форматировать строки с использованием плейсхолдеров и спецификаторов. Это удобно для создания строк с динамическими данными.
⚙️ String.matches()
В Java метод String.matches()
проверяет, соответствует ли строка заданному регулярному выражению. Это удобно для проверки формата строк, таких как email, номера телефонов и т.д.
⚙️ Math.random()
В Java метод Math.random()
генерирует случайное число с плавающей точкой от 0.0 (включительно) до 1.0 (исключительно). Это базовый способ генерации случайных чисел.
👩💻 Задача по Java: Подсчёт частоты слов в строке
Напишите метод, который принимает строку и возвращает Map
, где ключи — это слова из строки, а значения — количество их вхождений. Игнорируйте регистр и удаляйте знаки препинания.
Пример:
public class Main {
public static void main(String[] args) {
String text = "Hello, world! Hello Java.";
Map<String, Integer> result = countWordFrequency(text);
System.out.println(result);
// Ожидаемый результат:
// {hello=2, world=1, java=1}
}
}
⚙️ String.replaceAll()
В Java метод String.replaceAll()
заменяет все вхождения текста, соответствующего регулярному выражению, на заданную строку. Это мощный инструмент для обработки строк.
⚙️ StringBuilder.reverse()
В Java метод StringBuilder.reverse()
используется для разворота строки. Это удобный способ изменить порядок символов в строке без создания промежуточных объектов.
Согласованность в распределённой сети — вызов, который мы готовы принять!
На открытом уроке «Распределённые транзакции» разберём, как добиться согласованности данных в микросервисной и распределённой архитектуре. Изучим шаблон Saga, методы обработки ошибок и практики отката данных.
Представьте систему, которая работает без сбоев, несмотря на распределённость данных. Архитектура, которая поддерживает масштабируемость и надёжность, даже при высоких нагрузках.
🔥 Спикер Олег Мифле — бэкенд-разработчик в одной из крупнейших отечественных соцсетей с 15-летним опытом в IT.
🔴 Присоединяйтесь к вебинару 16 декабря в 20:00 мск! Урок пройдёт перед стартом курса «Highload Architect». Участники вебинара получат 🌲новогоднюю скидку на обучение: https://otus.pw/UtA7/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
⚙️ Collectors.toMap()
В Java метод Collectors.toMap()
собирает элементы потока в карту (Map), где вы можете указать функции для ключей и значений. Это удобно для преобразования коллекций в структуру ключ-значение.
Вы опытный Java-разработчик, но хотите большего?
📚 Углубитесь в устройство JVM, научитесь профилировать приложения, оптимизировать их для облаков и развертывать в Kubernetes. Это повышение квалификации для тех, кто готов выйти на новый уровень.
👉 Вы освоите реактивный подход, работу с метриками и логированием, научитесь анализировать дампы памяти и создавать REST API с OpenAPI и Protobuf.
🎁 Присоединяйтесь к курсу «Java Developer. Advanced» и получите скидку! Ваша карьера в IT ждет апгрейда: https://otus.pw/Tsfk/Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👩💻 Задача по Java: Binary Addition
Реализуйте функцию, которая принимает два числа, складывает их и возвращает результат в двоичном формате. Результат должен быть строкой.
Пример:
1, 1 --> "10" (1 + 1 = 2 in decimal or 10 in binary)
5, 9 --> "1110" (5 + 9 = 14 in decimal or 1110 in binary)
👩💻 Пройди тест по Java
Spring от А до Я: как быстро доставлять продукт в продакшн и радовать пользователей? 👩💻
Ответишь — пройдешь на продвинутый курс "Разработчик на Spring Framework" от OTUS по специальной цене.
👉 ПРОЙТИ ТЕСТ: https://otus.pw/YZF3/
🎫 Начни обучение со скидкой, подробности у менеджеров.Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
#вопросы_с_собеседований
Реализуйте в Java собственную реализацию синглтона (singleton). Напишите код и объясните, как работает ваша реализация, а также какие проблемы могут возникнуть при использовании синглтона и как вы можете их решить.
Объяснение:
Синглтон — это паттерн проектирования, который гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру. Реализация синглтона должна предотвращать создание нескольких экземпляров и предоставлять способ доступа к единственному экземпляру.
— Приватный конструктор: Конструктор класса сделан приватным, чтобы избежать создания экземпляров снаружи класса.
— Статический метод getInstance
: Метод getInstance
является статическим, чтобы можно было вызывать его без создания экземпляра класса. Внутри метода используется ленивая инициализация, то есть экземпляр создается только при первом вызове метода getInstance
.
— Синхронизация: В рассмотренной реализации используется ключевое слово synchronized
для обеспечения потокобезопасности при первом создании экземпляра. Однако это может сказаться на производительности. Существуют и другие подходы к обеспечению потокобезопасности, такие как использование volatile
или двойной проверки.
Проблемы синглтона и их решения:
— Ленивая инициализация: В данной реализации используется ленивая инициализация, что может вызвать проблемы в многопоточной среде.
Решение: использование volatile
или двойной проверки на null
для обеспечения безопасной ленивой инициализации.
— Сериализация: При сериализации и десериализации синглтона могут возникнуть проблемы, поскольку каждая десериализация создаст новый объект.
Решение: переопределить методы readResolve
и writeReplace
для управления процессом сериализации и десериализации.
— Тестирование: Трудно провести тестирование, так как синглтон предоставляет глобальную точку доступа.
Решение: использование dependency injection (внедрение зависимостей) для более гибкого тестирования.
Garbage Collection и JVM
JVM работает как хорошо отлаженный механизм, автоматически распределяя и освобождая память. Это и есть суть Garbage Collection. Это процесс, который автоматически находит и удаляет объекты, которые больше не используются вашим приложением. Благодаря этому, разработчики могут сосредоточиться на логике приложения, не беспокоясь о ручном управлении памятью.
Смотреть статью
Jansi
Jansi — это библиотека Java, которая позволяет форматировать текстовый вывод в консоли. Она предоставляет широкий спектр функций для управления цветами, шрифтами и другими аспектами отображения текста.
#для_продвинутых
#вопросы_с_собеседований
Что будет, если в Map положить два значения с одинаковым ключом?
Если в Map положить два значения с одинаковым ключом, то произойдет следующее:
— При добавлении второго значения с уже существующим ключом, первое значение, связанное с этим ключом, будет перезаписано.
— Map может содержать только уникальные ключи. При попытке добавить дублирующийся ключ, старое связанное значение будет заменено новым.
— Конкретная реализация Map (например, HashMap) может бросить исключение, если попытаться добавить дублирующийся ключ.
Таким образом, поведение в такой ситуации зависит от конкретной реализации интерфейса Map, но в целом дублирующиеся ключи в Map запрещены.
#вопросы_с_собеседований
Что такое ReentrantLock
в Java, какие преимущества он имеет перед ключевым словом synchronized, и как его правильно использовать?
Ответ ⬇️
ReentrantLock — это класс из пакета java.util.concurrent.locks, предоставляющий более гибкий механизм блокировки, чем synchronized. Он поддерживает методы для явного управления блокировками, такие как tryLock() (попытка захвата без ожидания) и lockInterruptibly() (захват с возможностью прерывания). В отличие от synchronized, он позволяет справляться с блокировками вручную и поддерживает более точное управление потоками. Однако неправильное использование может привести к deadlock.
Пример использования ⚙️
import java.util.concurrent.locks.ReentrantLock;Читать полностью…
public class Main {
private static final ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
Thread thread1 = new Thread(Main::criticalSection, "Thread-1");
Thread thread2 = new Thread(Main::criticalSection, "Thread-2");
thread1.start();
thread2.start();
}
private static void criticalSection() {
if (lock.tryLock()) { // Пытаемся захватить блокировку
try {
System.out.println(Thread.currentThread().getName() + " выполняет критическую секцию");
Thread.sleep(1000); // Эмуляция работы
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
lock.unlock(); // Обязательно освобождаем блокировку
System.out.println(Thread.currentThread().getName() + " завершил работу");
}
} else {
System.out.println(Thread.currentThread().getName() + " не смог захватить блокировку");
}
}
}
⚙️ Arrays.fill()
В Java метод Arrays.fill()
позволяет заполнить массив одним значением или диапазон массива заданным значением. Это удобный способ инициализировать или обновлять данные массива.
⚡️Хотите стать экспертом в разработке на Spring Framework?
Обучение «Разработчик на Spring Framework» от OTUS — это практический подход к освоению самого востребованного фреймворка для Java-разработчиков. Узнайте, как создавать веб-приложения на микросервисной архитектуре, автоматизировать задачи с Spring Boot и реализовывать высокоуровневые решения!
В конце курса у вас будет портфолио из готовых приложений и глубокое понимание работы со Spring. Пройдите вебинар-собеседование, чтобы быть готовым к реальным интервью.
👉Запишитесь на курс сейчас и перейдите на новый профессиональный уровень с дипломом, признанным крупными компаниями: https://otus.pw/aynT/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Забирай пошаговую roadmap по JAVA
FAANG School в течение 24 часов отдают бесплатно свою библиотеку знаний. Вы можете получить доступ:
– Redis - 5 улучшений для твоего пет-проекта
– Пошаговая RoadMap по Java
– Мануал по Docker. Основные команды и концепции
– Микросервисы. Вопросы с собеседований
– Шпаргалка с горячими клавишами JetBrains IDE. Ускоришь работу в 10 раз
– Desk setup. Подборка аксессуаров для комфортной работы
– Шпаргалка по Kafka
– Инструкция по работе с Git
– Подробный гайд, как найти работу в IT без опыта
– Подборка платформ с вакансиями для java-разработчиков
Последнее пополнение - Шпаргалка по Spring, в которой подробно разобрали, что такое паттерн Наблюдатель, и как его реализовать в Java. А также познакомитесь с событиями и научитесь работать с ними в Spring Boot!
Библиотека знаний обновляется постоянно, но бесплатный доступ длится всего сутки. Чтобы получить полезные материалы, переходи по ссылке и жми на оранжевую кнопку.
Бесплатный интенсив: Java-разработчик: старт в профессии с нуля.
📆 Когда: 21-22 декабря в 14:00 по мск.
За два дня интенсива в прямом эфире, под руководством опытного Java-разработчика, вы сможете:
✔️ Познакомиться с синтаксисом и основными конструкциями языка Java.
✔️ Написать свой первый проект и определить, подходит ли вам профессия разработчика.
✔️ Создать консольное приложение на Java с интеграцией API Яндекс.Карт для построения маршрутов и поиска информации.
✔️ Узнать ответы на интересующие вас вопросы.
✔️ Получить доступ к закрытому профессиональному сообществу.
🎁 Подарки для участников интенсива: гайд «Как заговорить на сленге IT-специалистов», карта компетенций начинающего Java-разработчика и доступ в закрытое сообщество «Старт в Java» от Хекслета!
Реклама. ООО "ХЕКСЛЕТ РУС". ИНН 7325174845. erid:LjN8KZbcA
⚙️ PriorityQueue
В Java класс PriorityQueue
предоставляет структуру данных с приоритетной очередью, где элементы извлекаются в порядке их приоритета. По умолчанию элементы сортируются по возрастанию, но можно задать собственный компаратор.
Приглашаем на митап Мир Plat.Form «Платежные технологии: биометрия и быстрые кешбэки»
🌐 Онлайн
📆 20 декабря в 17:00 (МСК, GMT+3)
В программе — два доклада:
🗣 Идентификация и оплата: как работает платформа биометрических сервисов (ПБС) — Сергей Лысенко, Алексей Бобруцков
Определим место НСПК в биоэквайринге. Поговорим об архитектуре и механизмах ПБС. Выясним, как совершается оплата с точки зрения клиента, с кем в разных процессах взаимодействует команда и как технологию применяют в нефинансовых сервисах.
🗣 Быстрые кешбэки для быстрых платежей: как работает платформа лояльности СБП — Константин Гузаров
Разберем, что скрывается под капотом программы лояльности «Привет!» в части СБП. Обсудим механику акций, потоки данных внутри системы лояльности, требования к сервису и историю его развития.
Вы сможете задать вопросы спикерам в чате митапа. За лучшие вопросы Мир Plat.Form подарит призы.
Регистрируйтесь на сайте митапа.
Реклама. АО "НСПК". ИНН 7706812159
⚙️ Optional.flatMap()
В Java метод Optional.flatMap()
позволяет преобразовать значение внутри Optional, возвращая другой Optional. Это особенно полезно для работы с вложенными Optional.
👩💻 Задача по Java: Удаление дубликатов из списка с сохранением порядка
Напишите метод, который принимает список строк и возвращает новый список, содержащий только уникальные строки, сохраняя их порядок появления.
Пример:
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> input = List.of("apple", "banana", "apple", "orange", "banana");
List<String> result = removeDuplicates(input);
System.out.println(result);
// Ожидаемый результат: [apple, banana, orange]
}
}
#вопросы_с_собеседований
Что такое ForkJoinPool в Java, как он работает, и как его использовать для параллельной обработки задач?
Ответ ⬇️
ForkJoinPool — это специализированный пул потоков, который рекурсивно делит задачи на подзадачи (fork) и объединяет их результаты (join). Он оптимизирован для задач, которые можно разделить на независимые части, например, вычисление суммы элементов массива. Основными классами являются RecursiveTask для задач с результатом и RecursiveAction для задач без результата.
Пример использования ⚙️
import java.util.concurrent.RecursiveTask;Читать полностью…
import java.util.concurrent.ForkJoinPool;
class SumTask extends RecursiveTask<Integer> {
private final int[] array;
private final int start, end;
public SumTask(int[] array, int start, int end) {
this.array = array;
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
if (end - start <= 5) {
int sum = 0;
for (int i = start; i < end; i++) sum += array[i];
return sum;
} else {
int mid = (start + end) / 2;
SumTask left = new SumTask(array, start, mid);
SumTask right = new SumTask(array, mid, end);
left.fork();
return right.compute() + left.join();
}
}
}
public class Main {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
ForkJoinPool pool = new ForkJoinPool();
int result = pool.invoke(new SumTask(array, 0, array.length));
System.out.println("Сумма: " + result); // Сумма: 55
}
}