Изучаем Java. По вопросам сотрудничества: @seniorvladislav
#вопросы_с_собеседований
Зачем нужны и какие бывают блоки инициализации?
Блоки инициализации используются для выполнения определенного кода при создании объекта.
Их использование позволяет вынести логику инициализации полей объекта за пределы конструкторов.
Бывают два типа блоков инициализации:
1. Блоки инициализации экземпляра - выполняются при создании каждого нового экземпляра класса. Они объявляются с помощью ключевого слова instance и фигурных скобок.
2. Статические блоки инициализации - выполняются один раз при загрузке класса. Они объявляются с помощью ключевого слова static и фигурных скобок.
StampedLock
StampedLock - это класс блокировки, представленный в Java 8, который предоставляет оптимистичную блокировку для чтения и эксклюзивную блокировку для записи.
Чтение может происходить параллельно с записью.
StampedLock позволяет избежать deadlock-ов, которые возможны при использовании ReadWriteLock.
В этом примере для чтения используется оптимистичная блокировка с помощью readLock(), а для записи - эксклюзивная блокировка с writeLock().
Множественные потоки могут одновременно вызывать readData(), тогда как updateData() будет заблокирован, если другой поток уже получил блокировку.
DelayQueue
DelayQueue - это тип очереди, который используется для задержки выполнения определенных операций.
DelayQueue хранит элементы, реализующие интерфейс Delayed. Этот интерфейс позволяет определить время задержки для каждого элемента.
Элементы извлекаются из очереди только по истечении их времени задержки.
DelayQueue реализует интерфейс BlockingQueue, поэтому извлечение элементов блокируется, если очередь пуста.
В этом примере мы добавляем в очередь два сообщения с разными задержками. Первое сообщение выводится через 5 секунд, второе - сразу же.
Дан массив положительных целых чисел nums и положительное целое число target, верните минимальную длину подмассива, чья сумма больше или равна target. Если такого подмассива не существует, то возвращается 0.
Решение может выглядеть следующим образом:
- Проходим циклом по всем элементам массива nums и прибавляем очередной элемент к sum.
- Проверяем, достигла ли текущая сумма целевого значения target. Если да, то циклом уменьшаем sum, вычитая элементы от nums[j], фиксируем текущую длину подмассива от j до i в ans.
- Обновляем ans, если текущая длина меньше найденной ранее.
- Возвращаем найденную минимальную длину или 0, если подмассив не найден.
#разбор_кода
#вопросы_с_собеседований
Можно ли перегрузить static метод?
Перегрузка методов позволяет создать несколько методов с одинаковым именем, но разными списками параметров. Это работает как для обычных, так и для статических методов класса.
Например, можно создать статический метод sum, который будет складывать числа. Метод можно перегрузить, создав одну версию для сложения целых чисел (int), а другую - для сложения чисел с плавающей точкой (double).
При вызове метода компилятор будет выбирать нужную версию на основе типа аргументов.
Это делает класс с перегруженными методами более гибким и удобным для использования.
❗️Как быстро разрабатывать качественный бэкенд на Kotlin?
Для этого нужно овладеть широким спектром инструментов разработки, знать Kotlin на высоком уровне, разбираться в DSL, мультиплатформенности, корутинах, передовых архитектурных шаблонах, темах высокой нагрузки, больших данных и масштабируемости.
🟠 Все это можно освоить на онлайн-курсе «Backend Developer. Professional» в OTUS.
Оставить заявку на курс и получите доступ к записям лучших открытых уроков курса уже сейчас!
👉 Оставить заявку: https://otus.pw/lFzZ/
Не пропустите возможность записаться на открытые уроки которые пройдут совсем скоро:
✅ Разработка монолитного приложения со Spring | 31.07
Записаться можно по ссылке: https://otus.pw/yMgq/
✅Применимость Kotlin в различных направлениях разработки: Multimedia, ML, 3D/VR, Frontend, IoT/Robotics, Blockchain | 14.08
Записаться можно по ссылке: https://otus.pw/7oNX/
Нативная интеграция. Информация о продукте www.otus.ru
«Асинхронная архитектура», о проектировании сложных распределенных систем
28 июля стартует 5 набор на курс «Асинхронная Архитектура». Приходите учиться, если уже напарывались на сервисную архитектуру, которая в итоге становилась распределённым монолитом, или просто хотите погрузится в мир больших распределённых систем.
Темы курса:
— обработка распределённых ошибок,
— тестирование распределённых систем,
— форматы данных и способы коммуникации,
— отказоустойчивость,
— эволюция — как добавлять новые события в сложные системы.
Курс направлен на мидлов, сеньоров, тимлидов и CTO. Отважным джунам тоже можно прийти — прокачаете мышление проектировщика, которое позволит писать более понятный и изолированный код.
Курс прикладной: будут домашки с разбором, которые готовят к реальной работе и реальным сложностям. За время курса вы сделаете проект с асинхронной архитектурой и положите себе в портфолио. Если успеете в дедлайн — получите сертификат на русском и английском языке, который можно привязать к линкедину.
Материалы курса проверены на почти 1500 учеников. На курсе учились команды из Arrival, Toptal, Яндекс, Озон, Авито, Сбер и другие.
Посмотреть программу, отзывы и бесплатный урок →
По промокоду seniorjavist10 скидка 10% до 26 июля. Платить можно самому сразу или частями. А лучше за счет компании из любой точки мира.
Queue
Queue — это интерфейс в Java Collections Framework, который представляет собой коллекцию элементов, организованных в соответствии с принципом FIFO (First In, First Out). Это означает, что элементы добавляются в конец очереди и извлекаются из начала очереди.
Queue используется в ситуациях, когда необходимо управлять порядком обработки элементов.
В этом примере мы создаем очередь строк и добавляем в нее три элемента. Затем мы извлекаем элементы из очереди с помощью метода poll(), который возвращает и удаляет элемент из начала очереди. Элементы извлекаются в том же порядке, в каком и добавляются.
Sorted set
SortedSet — это интерфейс в Java Collection Framework, который предоставляет упорядочение элементов в множестве. Элементы упорядочиваются с помощью их естественного порядка или с помощью компаратора, который обычно предоставляется при создании отсортированного множества.
SortedSet имеет несколько дополнительных операций, которые позволяют использовать упорядочение элементов:
- first() и last() возвращают первый и последний элементы в множестве соответственно.
- headSet(), tailSet() и subSet() возвращают подмножества элементов, которые находятся до, после или между заданными элементами соответственно.
В этом примере мы создаем TreeSet (класс, который реализует SortedSet) и добавляем в него несколько строк. Поскольку строки реализуют интерфейс Comparable, они упорядочиваются в алфавитном порядке. Затем мы используем различные методы SortedSet для получения первого и последнего элементов, а также подмножеств элементов.
Профессия «Java-разработчик». Курс с нуля до трудоустройства за 10 месяцев.
Освойте язык крупного бизнеса и финансовых технологий и научитесь разрабатывать веб-приложения на фреймворке Spring.
🎁 Мы подготовили для вас спецпредложения, чтобы решиться было проще! Выбирайте один из бонусов: 2 месяца академического отпуска, 1 месяц персональных консультаций с наставником и подготовка к техническому интервью, кешбэк 20 000 ₽ после полного прохождения программы.
Готовы попробовать прямо сейчас? Оставьте заявку, и мы расскажем, как пройти бесплатные курсы профессии!
#вопросы_с_собеседований
Какие преобразования называются нисходящими и восходящими?
Восходящее преобразование (Upcasting) — это преобразование объекта дочернего класса в объект родительского класса. Преобразование может быть выполнено неявно, так как дочерний класс является подтипом родительского класса. Восходящее преобразование позволяет нам получить доступ к членам родительского класса, но не ко всем членам дочернего класса.
Нисходящее преобразование (Downcasting) — это преобразование объекта родительского класса в объект дочернего класса. Это преобразование не может быть выполнено неявно и требует явного указания типа. Нисходящее преобразование может быть опасным, так как оно может привести к ошибке ClassCastException, если типы не совместимы.
Ключевое слово instanceof
instanceof — это двоичный оператор, используемый для проверки, является ли объект (экземпляр) подтипом данного типа. Возвращает либо true, либо false.
Для демонстрации мы создали переменную name типа String и использовали оператор instanceof, чтобы проверить, является ли name экземпляром класса String. Оператор возвращает true.
#это_база
Дано целое число, преобразовать его в римскую цифру.
В нашем решении метод intToRoman принимает целое число num в качестве аргумента и возвращает его римское представление в виде строки.
Внутри метода intToRoman создается пустая строка Roman, которая будет использоваться для хранения результата. Затем создается двумерный массив storeIntRoman, который содержит соответствия между арабскими и римскими числами.
Далее в цикле for перебираются все элементы массива storeIntRoman.
Внутри цикла используется цикл while, который выполняется до тех пор, пока значение num больше или равно текущему элементу массива storeIntRoman.
В теле этого цикла к строке Roman добавляется римское число, соответствующее текущему элементу массива storeIntRoman, а значение num уменьшается на соответствующее арабское число.
После завершения всех итераций цикла for возвращается строка Roman, содержащая римское представление входного числа.
#разбор_кода
#вопросы_с_собеседований
Что такое сигнатура метода?
Сигнатура метода — это уникальная комбинация имени метода и списка его параметров. Сигнатура метода определяет, какие аргументы должны быть переданы методу при его вызове.
Сигнатура метода используется для определения перегрузки методов. Два или более метода считаются перегруженными, если они имеют одинаковое имя, но разные сигнатуры. То есть они принимают разные наборы параметров.
Важно отметить, что сигнатура метода не включает в себя возвращаемый тип и модификаторы доступа.
🪙 Освой Spring и требуй повышения зарплаты!
Готов?
Пройди тест по Spring и проверь свои знания.
Ответишь — пройдешь на продвинутый курс "Разработчик на Spring Framework" от OTUS по специальной цене + получишь доступ к записям открытых уроков курса🎁 .
👉 ПРОЙТИ ТЕСТ: https://otus.pw/zzEV/Нативная интеграция. Информация о продукте www.otus.ru
Погрузиться в мир Javа и написать свою первую программу?
Уже через 14 дней подготовительного курса!
✔️ Даем крепкие базовые знания Javа, с ними легко продолжить обучение и влиться в профессию.
✔️ Учим не только писать, но и понимать код.
✔️Опытный наставник всегда поможет и подскажет.
⏰ Начало уже 1 августа!
Всего 990 ₽ и ваше жгучее желание начать. Приходите с любым бэкграундом: нам не важны возраст, пол, образование и текущая профессия!
Популярность языка Java растёт, востребованность разработчиков — тоже. А возрастных ограничений для специалистов нет: Java-разработчиком можно стать в любом возрасте. Попробуйте сами на бесплатном интенсиве.
Подробная программа и регистрация: 👉https://epic.st/koIKA6
📌Java в своих продуктах используют Twitter, Spotify, Netflix и другие сервисы. Игры Minecraft и Assassin’s Creed тоже написаны на Java.
🔝Спикер Даниил Пилипенко — основатель и директор центра подбора IT-специалистов SymbioWay. 19+ лет работает в сфере Java и веб-разработки.
Вы узнаете, какие навыки нужны Java-разработчику для трудоустройства, и напишете код без опыта в программировании. Создадите Telegram-бота с тестом по Java и сможете адаптировать его под другие задачи.
🎁 Каждый, кто оставит заявку на участие в интенсиве, получит гайд по профессии Java-разработчика. Тем, кто будет онлайн, подарим сертификаты на скидку 10 000 рублей для обучения на образовательной платформе Skillbox. А всем, кто дойдёт до конца интенсива, — электронную книгу издательства МИФ.
Реклама. ЧОУ ДПО «Образовательные технологии «Скилбокс (Коробка навыков)», ИНН: 9704088880
Инкапсуляция
Инкапсуляция - это принцип ООП, который заключается в сокрытии внутреннего представления класса от внешнего мира. Для этого используются модификаторы доступа: private, protected, public.
Обычно поля класса делаются private или protected, а методы - public. Это позволяет скрыть реализацию класса и предоставить к ней контролируемый доступ через public методы.
При запуске этой программы на выходе мы получим:
John 0
#это_база
Понимание интерфейсов в Go помогает разработчику создавать гибкие и расширяемые архитектуры для крупных проектов. Благодаря интерфейсам можно определить общие контракты и взаимодействия между компонентами системы, что упрощает интеграцию новых функциональностей и поддержку кода в будущем.
Чтобы глубже разобраться в Go или переехать на него с другого языка, для работы над сложными и интересными проектами, начните обучение 🗓 21.07 в 20:00 с бесплатного открытого урока «Интерфейсы изнутри в Golang», который является частью обновленной программы «Golang Developer. Professional» от OTUS
На открытом уроке мы обсудим:
- определение и реализацию интерфейсов,
- внутреннее устройства интерфейсов,
- использование пустого интерфейса (interace{}),
- влияние интерфейсов на производительность, безопасное и опасное приведение типов (type cast), - использование switch в контексте интерфейсов.
Спикер 👨💻 Алексей Семушкин, Software Engineer at Semrush, более 5 лет опыта в разработке ПО.
Открытый урок будет полезен начинающим Golang разработчикам и тем кто планирует переходить на GO имея опыт работы с другими языками.
👉 Записаться на урок — https://otus.pw/qRqt/
Не упустите возможность протестировать курс и узнать больше о Go. Больше полезных тем ждут вас на курсе «Golang Developer. Professional», доступные разные способы оплаты.
Нативная интеграция. Информация на сайте www.otus.ru.
Вложенные классы
Вложенные классы (nested classes) — это классы, определенные внутри другого класса. В Java есть два типа вложенных классов:
- Статические вложенные классы (static nested classes) — объявляются с модификатором static. Представляют собой обычные статические члены внешнего класса.
- Внутренние классы (inner classes) — объявляются без модификатора static. Связаны с экземпляром внешнего класса и имеют доступ к его членам.
Вложенные классы удобны для логической группировки классов и обеспечения инкапсуляции.
Как видно из примера, статический вложенный класс создается так же, как и обычный статический класс. А для создания экземпляра внутреннего класса сначала нужно создать экземпляр внешнего класса.
#это_база
Thread.UncaughtExceptionHandler
Thread.UncaughtExceptionHandler — это интерфейс, который позволяет перехватывать необработанные исключения в потоках. Синтаксис: uncaughtException(Thread t, Throwable e).
Этот интерфейс можно использовать для логирования ошибок, которые приводят к аварийному завершению потока.
В этом примере создается поток, который генерирует исключение. Для него устанавливается обработчик не перехваченных исключений ExceptionHandler.
При запуске потока произойдет исключение, которое будет перехвачено обработчиком и выведено в консоль:
Перехвачено исключение в потоке Мой поток: Ошибка в потоке
Дан целочисленный массив nums, вернуть [nums[i], nums[j], nums[k]] такие, что i != j, i != k, j != k, и nums[i] + nums[j] + nums[k] == 0.
В нашем решении метод threeSum принимает на вход массив чисел nums и возвращает список списков, содержащих тройки чисел, удовлетворяющие условию.
Для этого массив сначала сортируется, а затем используется техника двух указателей для поиска троек. Подробные пояснения предоставлены на изображении.
#разбор_кода
Владение индексами в PostgreSQL является критическим навыком для разработчиков, работающих с высокими нагрузками. Он позволяет значительно улучшить производительность базы данных, снизить задержки при выполнении запросов и обеспечить более плавное функционирование приложения даже при большом количестве одновременных запросов.
Чтобы погрузиться в эту тему и получить лучшие практики для работы с высокими нагрузками приходите 🗓 2 августа в 20:00 на открытый урок «Индексы в PostgreSQL» онлайн курса «Highload Architect» от OTUS. 👨💻 Занятие проведет преподаватель Андрей Поляков, старший разработчик в Unlimint.
На открытом уроке обсудим:
- устройство структуры данных B-tree, в которой хранятся индексы
- устройство индексов в PostgreSQL: B-дерево, хеш, GiST, SP-GiST, GIN и BRIN
- принципы построения планов запросов в PostgreSQL.
И научимся:
- пользоваться командой explain в PostgreSQL;
- строить индексы, позволяющие оптимизировать запросы;
- составлять запросы, позволяющие переиспользовать существующие индексы.
👉 Регистрируйтесь на занятие — https://otus.pw/SSIW/
Открытый урок приурочен к старту онлайн-курса «Highload Architect» в OTUS. После урока полный курс вы сможете приобрести удобным для вас способом.
Реклама. Информация о рекламодателе на сайте www.otus.ru
Конструктор по умолчанию
Конструктор по умолчанию предоставляется компилятором Java, если в классе не определен ни один другой конструктор. Конструктор по умолчанию инициализирует все поля класса значениями по умолчанию (например, 0 для числовых типов, false для типа boolean, null для ссылочных типов).
Если же в классе определен хотя бы один конструктор (с параметрами или без), компилятор не будет предоставлять конструктор по умолчанию, и его необходимо определить явно, если он нужен.
В этом примере мы определяем класс MyClass с двумя полями: x и y, а также определяем конструктор по умолчанию, который выводит сообщение при вызове. В методе main создаем экземпляр класса MyClass, используя конструктор по умолчанию, и выводим значения полей x и y, которые инициализированы значениями по умолчанию.
#это_база
Дана входная строка s, необходимо изменить порядок слов в строке на противоположный.
Слово определяется как последовательность символов, не содержащих пробелов. Слова в s будут разделены как минимум одним пробелом.
Вернуть строку, состоящую из слов в обратном порядке, объединенных одним пробелом.
*s может содержать начальные или конечные пробелы, а также несколько пробелов между двумя словами. Возвращаемая строка должна содержать только один пробел, разделяющий слова.
Код выше разбивает входную строку на слова, используя пробелы в качестве разделителя, а затем объединяет слова в обратном порядке, чтобы получить итоговую строку.
Более детальные пояснения отражены на изображении.
#разбор_кода
ThreadPool
ThreadPool — это механизм, который позволяет повторно использовать ранее созданные потоки для выполнения текущих задач.
Так как поток уже существует, когда поступает запрос, задержка, вызванная созданием потока, устраняется, что делает приложение более отзывчивым.
В этом примере мы создаем пул потоков с фиксированным размером 2 и отправляем 5 задач для выполнения в этот пул.
Когда задача выполняется, вызывается метод run() и выводит имя текущего потока, статус “Start” и значение command. Затем вызывается метод processCommand(), приостанавливающий выполнение потока на 5 секунд. После этого выводится имя потока и статус “End”.
После отправки всех задач в пул потоков вызывается метод shutdown(), который запрещает отправку новых задач в пул. Затем вызывается метод awaitTermination() с максимальным значением времени ожидания, чтобы дождаться завершения всех задач.
Хотите усовершенствовать свои навыки Java с помощью Groovy?
Начните с открытого урока "Введение в функциональное программирование в Groovy" от OTUS. Вебинар пройдёт 24 июля в 20:00 и проведет его преподаватель Андрей Поляков, старший разработчик в Unlimint.
Урок приурочен к старту онлайн-курса "Groovy Developer".
🔥На уроке вы:
- познакомитесь с понятием функциональное программирование;
- узнаете в чем отличие функционального программирования от ООП;
- познакомитесь с Closures, контекстом исполнения, областями видимости;
- познакомитесь с использованием Closures как функций.
Кому будет полезен этот урок?
Разработчикам, QA, DevOps, которые хотят более глубоко понять, как работают инструменты тестирования
и CI/CD jenkins.
После вебинара полный курс можно приобрести в рассрочку.
⚡️Для участия зарегистрируйтесь: https://otus.pw/ad7b/
Реклама. Информация о рекламодателе на сайте www.otus.ru.
Мужчинам без радости в жизни
Проблема: неправильно выстроенные отношения с девушками, как итог - зависимость, слабая позиция и непроработанные внутренние опоры. Исправить это может каждый, достаточно читать «НеНастоящий» мужчина
Ваня по шагам рассказывает, как выстроить свободные и яркие отношения с девушками. Без манипуляций, без криков и психологов
Это должен знать каждый мужчина — @unreal_man
interrupted()
Метод interrupted() является статическим методом класса Thread и проверяет, был ли установлен флаг прерывания у текущего потока. При этом флаг прерывания после вызова этого метода сбрасывается.
В этом примере создается новый поток, который выполняет цикл while, пока флаг прерывания не установлен. Затем главный поток останавливается с помощью sleep(), после чего вызывается метод interrupt() для нового потока, чтобы установить флаг прерывания. Когда флаг прерывания установлен, цикл while завершается и выводится сообщение "Thread has been interrupted".
Количество строк "Thread is running" может отличаться в зависимости от скорости выполнения кода.
String.replace()
Метод replace() используется для замены всех вхождений одного символа или подстроки на другой символ или подстроку в исходной строке. Этот метод возвращает новую строку с замененными символами или подстроками.
В этом примере создается строка "Hello, World!" и вызывается метод replace() для замены всех вхождений символа 'l' на символ 'w'. Результат замены сохраняется в новой строке replaced. Затем исходная и измененная строки выводятся.
#это_база