seniorjavist | Unsorted

Telegram-канал seniorjavist - Senior Java Developer

-

Изучаем Java. По вопросам сотрудничества: @seniorvladislav

Subscribe to a channel

Senior Java Developer

Применение CompletableFuture в Java для асинхронного программирования

CompletableFuture
— это класс в Java, который предоставляет удобный API для работы с асинхронными вычислениями. CompletableFuture позволяет вам запускать задачи асинхронно и комбинировать их результаты без использования блокировок или других механизмов синхронизации.

В этом примере мы создаем два CompletableFuture, каждый из которых выполняет задачу в асинхронном режиме. Метод thenCombine() используется для объединения результатов двух Future, когда они оба доступны. В результате, мы получаем новый CompletableFuture, который завершится после того, как оба исходных Future будут завершены и вернет сумму их результатов.

Обратите внимание на то, что весь код асинхронен, и основной поток не блокируется во время ожидания завершения Future.

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Что такое Instance Variable?

Instance Variable — переменная, которая определена внутри класса, и она существует вплоть до того момента, пока существует объект.

Пример — класс Bee, в котором есть две переменные nectarCapacity и maxNectarCapacity

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Что такое Local Variable?

Популярный вопрос на собеседовании Java-разработчика. Local variable — это переменная, которая определена внутри метода и существует вплоть до того момента, пока выполняется этот метод. Как только выполнение закончится, локальная переменная перестанет существовать.

Вот программа, которая использует локальную переменную helloMessage в методе main()

Читать полностью…

Senior Java Developer

Final методы

Когда метод маркирован как final, его называют final метод (логично, правда?). Final метод нельзя переопределять у класса наследника.

К слову, методы в классе Object — wait() и notify() — это final, поэтому у нас нет возможность их переопределять.

Как и где использовать final в Java

🔸использовать ключевое слово final, чтобы определить некоторые константы уровня класса;
🔸создавать final переменные для объектов, когда вы не хотите, чтобы они были изменены. Например, специфичные для объекта свойства, которые мы можем использовать для целей логирования;
🔸если не нужно, чтобы класс был расширен, отметить его как окончательный;
🔸если нужно создать immutable< класс, нужно сделать его финальным;
🔸если нужно, чтоб реализация метода не менялась в наследниках, обозначить метод как final. Это очень важно, чтобы быть уверенным, что реализация не изменится.

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
В чем разница между execute, executeQuery, executeUpdate?

🔸Выполнение инструкции(строковый запрос) используется для выполнения любого SQL-запроса и возвращает TRUE, если результатом является ResultSet, такой как выполнение запросов Select. Выходные данные – ЛОЖЬ, если нет объекта ResultSet, такого как выполняющиеся запросы Insert или Update. Мы можем использовать getResultSet(), чтобы получить ResultSet, и метод getUpdateCount(), чтобы получить счетчик обновлений.
🔸Оператор executeQuery(строковый запрос) используется для выполнения запросов Select и возвращает ResultSet. Возвращаемый ResultSet никогда не является нулевым, даже если нет записей, соответствующих запросу. При выполнении запросов select мы должны использовать метод executeQuery, чтобы, если кто-то попытается выполнить оператор вставки / обновления, он выбросит java.sql.SQLException с сообщением «Метод executeQuery не может использоваться для обновления».
🔸Оператор executeUpdate (строковый запрос ) используется для выполнения операторов Insert / Update / Delete (DML) или операторов DDL, которые ничего не возвращают. Результат – int и равен количеству строк для операторов языка манипулирования данными SQL (DML). Для операторов DDL на выходе будет 0.

Читать полностью…

Senior Java Developer

ReentrantLock

Примитив синхронизации, с помощью которого можно установить границы критической секции. Тред, перед входом в критическую секцию должен сделать захват c операцией lock(), после выхода из крит. секции — сделать unlock(). Другой тред в это время ожидает на lock'е (можно указывать таймаут ожидания), либо может проверить доступность через tryLock().

ReentrantLock обязательно нужно освобождать (такое кол-во раз, сколько раз он был захвачен), в противном случае будет thread starvation у других тредов, ожидающих у границы критической секции.
ReentrantLock может быть «честным» (fairness = true), тогда приоритет отдается тредам, ждущих на нем наибольшее кол-во времени, но это вроде как уменьшает производительность

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
ThreadPoolExecutor — описать механизм работы, св-ва, частности (fixed threadpool, scheduled, single thread executor)

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

Основными св-вами ThreadPoolExecutor являются corePoolSize и maxPoolSize. Если текущее количество тредов в пуле < corePoolSize — новый тред будет создаваться в независимости от того, есть ли в пуле незанятые треды. В промежутке между corePoolSize и maxPoolSize тред будет создаваться в том случае, если заполнена очередь задач, и удаляться спустя keepAliveTime. Если кол-во тредов стало >= maxPoolSize — новые треды не создаются, а задачи ставятся в очередь.

Есть возможность регулировать поведение очереди:
🔸Direct handoffs: немедленная передача задачи тредпулу. Нет понятия очереди задачи. Если свободных тредов нет — кидается exception. Применимо при неограниченных maxPoolSize, но нужно понимать проблему при быстрых записях и медленных чтениях, что может спровоцировать непомерное потребление ресурсов
🔸Unbounded queues: очередь без ограничений. Задачи будут добавляться в нее при превышении corePoolSize, при этом maxPoolSize будет игнорироваться. Unbounded queues имеют проблемы потребления ресурсов при больших нагрузках, но сглаживают рост тредов при пиках.
🔸Bounded queues: очередь с ограничениями. Задачи будут добавляться в очередь до достижения некоего capacity. Для достижения наилучшей производительности нужно понимать размеры corePoolSize и самой очереди и чем можно пожертвовать — перфомансом (малый corePoolSize и большая очередь), или же памятью (ограниченная очередь, большой corePoolSize)


Частности ThreadPoolExecutor:
ScheduleThreadPoolExecutor — применяется для периодичных по времени задач
fixed thread pool — частность ScheduleThreadPoolExecutor'а с настроенным corePoolSize и unbounded queue
single thread executor — тредпулл, c сorePoolSize = 1, гарантирующий последовательное выполнение задач из очереди

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Generics: В чем преимущество, как работают? Что такое type-erasure? В чем отличие от шаблонов C++?

🔸Типы дженерики обеспечивают параметрический полиморфизм, т.е выполнение идентичного кода для различных типов. Типичный пример — коллекции, итераторы
🔸type-erasure — это стирание информации о типе-параметре в runtime. Таким образом, в байт-коде мы увидим List, Set вместо List<Integer>, Set<Integer>, ну и type-cast'ы при необходимости
🔸В отличие от дженериков в Java, в С++ шаблоны в итоге приводят к компиляции метода или типа для каждого специфицированного типа параметра (специализация шаблона). Да простят меня здесь адепты С++.

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Swing: рассказать про EDT, как им пользоваться

EDT — тред в котором производится обработка пользовательских действий на UI: движение курсора, нажатие клавиш, скролл, drag'n'drop и.т.д. Соотвественно, все «тяжелые» по времени и ресурсам операции нужно выносить в отдельный worker-тред (SwingUtils.invokeLater(...)), чтобы не фризить EDT.

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Как в Java сделать утечку памяти? 

Используя самописный класс стека, при выполнении операции pop() не присваивать предыдущей ссылке значение null.
Также можно неверно использовать HashMap вместо WeakHashMap для кэширования чего-нибудь большого, например картинок ваших товаров, пользователей и т.д в. Т.к ссылки на ключи сильные (strong references), значения по этим ключам будут висеть в хипе до следующей перезагрузки jvm процесса или удаления ключа из мапы и обнуления ссылки на него.

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Что такое string-pool? В чем отличие cоздания строки через new от литерала? Что такое String.intern()?

string-pool — структура в памяти, хранящая массив всех строк-литералов программы.
String.intern(), соответственно, вернет строку из пула, при наличии таковой. Полезно при сравнениях вида:

new String("hello").intern() == new String("hello").intern()

Т.к. без интернирования пришлось бы сравнивать строки через equals, что может быть медленнее при наличии длинных строк. В данном случае возвращается ссылка на один и тот же объект строки из пула, и проверка проходит с true.

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
В чем разница между композицией и агрегацией?

Ассоциация
обозначает связь между объектами. Композиция и агрегация — частные случаи ассоциации «часть-целое».

Агрегация предполагает, что объекты связаны взаимоотношением «part-of» (часть). Композиция более строгий вариант агрегации. Дополнительно к требованию «part-of» накладывается условие, что экземпляр «части» может входить только в одно целое (или никуда не входить), в то время как в случае агрегации экземпляр «части» может входить в несколько целых.

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

Читать полностью…

Senior Java Developer

Познакомьтесь с востребованным направлением программирования — Java-разработкой. Освойте базовые инструменты на практике и выйдите на рынок IT. Сделайте первый шаг — участвуйте в онлайн-интенсиве Skillbox с 27 по 29 апреля в 15:00 по московскому времени: 👉 https://epic.st/fDe9uE

После регистрации сразу отправим вам на почту гайд по профессии Java-разработчика: из него вы узнаете, сложно ли изучить Java, сколько зарабатывают специалисты и как начать карьеру в этой сфере.

Интенсив ведёт Даниил Пилипенко — основатель и директор центра подбора IT-специалистов SymbioWay.
С 2004 года разрабатывает и руководит разработкой на Java, PHP и во фронтенде.
Он расскажет, как устроен язык Java, и научит писать простейший код, даже если вы никогда не программировали. Объяснит, как работать с файлами и переменными, а также где найти первых клиентов.

🎁 Всем, кто дойдёт до конца интенсива, подарим электронную книгу издательства МИФ «Разум под контролем» Роджера Сайпа и Робба Збиерски.

Подключайтесь к прямым эфирам и используйте возможность получить сертификат на скидку 10 000 рублей на любой курс Skillbox.

Сделайте первый шаг к перспективной IT-профессии!

Читать полностью…

Senior Java Developer

Успей подать заявку в Школу бэкенд-разработки от Академии Яндекса!

Мы приглашаем специалистов с опытом коммерческой разработки не менее года, готовых получать новые знания о бэкенде высоконагруженных сервисов и не только. В этом году обучение пройдет по четырем трекам: Python, Java, C++ и Go.

Обучение состоит из двух этапов:
🔸 с 6 июня по 31 июля — лекции и практические задания в онлайн-формате;
🔸 с 1 по 27 августа — офлайн-этап: студенты соберутся в команды, чтобы реализовать настоящий проект от Яндекса в офисах в Москве, Белграде и Алматы.

Участие в школах бесплатное, занятия можно совмещать с работой или учёбой. Иногородним студентам школы Яндекс оплатит проживание и билеты во время офлайн-этапа. Лучшим студентам по итогам школы — офер в штат Яндекса.

Подать заявку можно до 27 апреля: https://clck.ru/34C7VQ

Читать полностью…

Senior Java Developer

Spring @ Transactional — ошибки, которые совершали все

Вероятно, одной из наиболее часто используемых аннотаций Spring является @ Transactional. Несмотря на ее популярность, иногда она используется неправильно, в результате чего получается не совсем то, что задумал инженер-программист.

В этой статье я собрал проблемы, с которыми лично сталкивался в проектах. Надеюсь, этот список поможет вам лучше понять транзакции и поспособствует устранению нескольких ваших замечаний.

https://habr.com/ru/companies/otus/articles/574470/

Читать полностью…

Senior Java Developer

Реализация модели акторов с использованием Akka в Java

Сегодня мы углубимся в мир параллелизма и поговорим о модели акторов, используя библиотеку Akka в Java. Это современный подход к обработке параллельных процессов, и его основное преимущество - это абстрагирование от низкоуровневых деталей, таких как блокировки и потоки.

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

В данном коде мы создали актор SimpleActor, который может получать сообщения типа String. В ответ на полученное сообщение, он просто логирует его. Если актор получает сообщение, которое не является строкой, он также логирует, что получил неизвестное сообщение.

Читать полностью…

Senior Java Developer

Что такое ключевое слово final и где его использовать?

Ключевое слово final можно использовать для переменных, методов и классов.
🔸final переменную нельзя переназначить на другой объект.
🔸final класс бесплоден)) у него не может быть наследников.
🔸final метод не может быть переопределен у предка.

final переменные

Java дает нам два способа создать переменную и присвоить ей некоторое значение:
🔸Можно объявить переменную и инициализировать ее позже.
🔸Можно объявить переменную и сразу же назначить ее.
Пример с использованием final переменной для этих случаев:

Читать полностью…

Senior Java Developer

🔥Кто сегодня являются первыми среди первых для работодателей в мире IT?

Возможно, это Cloud Solution Architecture - те самые специалисты, которые формируют устойчивые облачные цепочки, управляют ими, оптимизируют.

Начни свой левел-ап в мир облачной архитектуры с открытого урока «Supply Chain Management (SCM) в Облаке. AWS CloudFormation».

Занятие приурочено к новому запуску курса «Cloud Solution Architecture» в Отус и пройдет 10 мая в 20.00 (мск).

📚На вебинаре мы:

- Рассмотрим AWS SAM для serverless
- Познакомимся с Cloudformation
- Изучим основные сущности
- Проведем демонстрацию развертывания инфраструктуры через Cloudformation

👍Участие в уроке бесплатное! Требуется вступительный ТЕСТ https://otus.pw/tPaI/

Преподаватель:
Андрей Поляков - старший разработчик в Unlimint

Продолжить изучение практик по работе над архитектурой облачных решений вы сможете на курсе «Cloud Solution Architecture». Сейчас возможны разные способы оплаты обучения. Дополнительный бонус для студентов курса - доступ к AWS. Нативная интеграция. Информация о продукте www.otus.ru

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Как файлы cookie работают в сервлетах?

🔸Файлы cookie – это текстовые данные, отправляемые сервером клиенту и сохраняемые на локальном компьютере клиента.
🔸Servlet API обеспечивает поддержку файлов cookie через класс javax.servlet.http.Cookie, который реализует интерфейсы Serializable и Cloneable.
🔸Метод HttpServletRequest getCookies() предоставляется для получения массива файлов cookie из запроса, поскольку нет смысла добавлять файлы cookie в запрос, нет методов для установки или добавления файлов cookie в запрос.
🔸Аналогичным образом предоставляется метод HttpServletResponse addCookie(Cookie c) для прикрепления файла cookie в заголовке ответа, методы получения для cookie отсутствуют.

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Из за чего может возникать NoClassDefFoundError, NoSuchMethodError?

🔸 NoClassDefFoundError может возникнуть, если нужной библиотеки с этим классом нет в classpath
🔸 NoSuchMethodError может возникнуть из-за несовместимости ваших библиотек, если зависимая библиотека A вызывает метод из старой версии библиотеки B, но в classpath есть более новая версия библиотеки B, c другой сигнатурой этого метода

Читать полностью…

Senior Java Developer

Стажировка Deep Dive: что это, кого ищут и почему это может быть интересней, чем классическая стажировка 🤔

Deep Dive — оплачиваемая стажировка от Яндекс Маркета, которая проходит
в формате буткемпа. Это интенсив, где участники в течение 3–4 месяцев могут поработать сразу в двух разных командах и выбрать ту, что нравится больше.

Стажёров ищут по трём направлениям:
— бэкенд (С++, Java)
— фронтенд (JavaScript)
— мобильная разработка (iOS, Android)

Что вас ждёт?
1️⃣ Знакомство с технологиями Яндекса, особенностями процесса разработки, программами и инструментами.
2️⃣ Работа над реальными задачами в первой команде и комплексная обратная связь, по итогам которой вам подберут вторую команду.
3️⃣ Работа над новыми задачами во второй команде.

🔥 У всех, кто хорошо себя проявит, будет шанс попасть в штат компании и выбрать команду, в которой больше понравилось работать.

Выход на стажировку 31 мая
📎 Подать заявку

Читать полностью…

Senior Java Developer

Countdown Latch/Cyclic Barrier

CountdownLatch («защелка») — примитив синхронизации, с помощью которого, например, основной thread может ожидать выполнения работы остальных N тредов. Треды, выполняющие работу, выполняют countDown() на защелке, основной тред ожидает на операции await(). Когда счетчик достигает нуля, основной тред продолжает работу.

Для синхронизации N тредов (все ждут всех) и переиспользования используется CyclicBarrier, ему также можно указывать действие (через Runnable), выполняемое после синхронизации всех-со-всеми

Читать полностью…

Senior Java Developer

Стать сотрудником Яндекса быстрее и проще, чем кажется. Участвуйте в днях быстрого найма: решите тестовое, пройдите несколько секций собеседования и получите офер за несколько дней.

Теперь дни быстрого найма будут проходить регулярно. Чтобы вам было удобно следить за расписанием, собрали его на отдельной странице.

Ближайшее мероприятие:

• 13-14 мая — Fast Track для бэкенд-разработчиков пишущих на Python или С++, либо тех, кто готов на них перейти, офер за 2 дня в команду RideTech.

Зарегистрироваться

Читать полностью…

Senior Java Developer

Если бы Даша обратилась к нам — уже хвасталась бы оффером перед друзьями)

Мы в codereview помогаем junior и middle разработчикам с трудоустройством👇

🎢 Разрабатываем стратегию поиска: знаем источники вакансий, о которых многие и не слышали.
🔥 Делаем огненное резюме + оформляем LInkedIn и Github. На этом моменте шанс на оффер увеличивается на 70%.
🗣 Проводим серию Mock Interview, чтобы ты уверенно чувствовал себя на собеседовании.
👨‍🏫 Рекомендуем тебя партнерам. Мы сотрудничаем с OZON, Сбером, VK и другими крупными компаниями.

И самое главное: будем саппортить тебя в течение полугода, пока ты не получишь оффер.

✌️Пора переходить к активным действиям, если хочешь найти работу в этом году! Оставляй заявку на бесплатную консультацию с нашим HR или Senior разработчиком. Ждем!

Читать полностью…

Senior Java Developer

Стойте! Если хотите шарить, или уже шарите в Java или Kotlin, то эти каналы однозначно для вас!

После их прочтения вы 100%
повысите свой уровень в несколько раз! Админ каналов Senior-разработчик, а значит ему можно доверять своё обучение:

1. Java Библиотека — Книги, статьи, фичи и советы. Сборная солянка для прогеров.

2. Kotlin Developer - самый топовый канал для котлин разработчика!

3. Книги для Java Программистов — Название говорит само за себя. Лучшие платные и бесплатные книги собраны в одном месте!

4. Java Guru — Хотите пройти собеседование и рубить по 300.000₽ в месяц? Всё возможно, но для этого надо прорешать не одну сотню задач и тестов — на этом канале как раз всё собрано.

5. Java News — А этот канал ежедневно вводит в курс дела и новостей любимого ЯП!

Подписывайтесь на все 5 каналов и станьте мега-программистом!

Читать полностью…

Senior Java Developer

Сжатие указателей в Java

В статье речь пойдет о реализации сжатия указателей в Java Virtual Machine 64-bit, которое контролируется опцией UseCompressedOops и включено по-умолчанию для 64 битных систем начиная с Java SE 6u23.

Смотреть статью

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Что такое статическое и динамическое связывание?

Присоединение вызова метода к телу метода называется связыванием. Если связывание проводится компилятором (компоновщиком) перед запуском программы, то оно называется статическим или ранним связыванием (early binding).

В свою очередь, позднее связывание (late binding) - это связывание, проводимое непосредственно во время выполнения программы, в зависимости от типа объекта. Позднее связывание также называют динамическим (dynamic) или связыванием на стадии выполнения (runtime binding). В языках, реализующих позднее связывание, должен существовать механизм определения фактического типа объекта во время работы программы, для вызова подходящего метода. Иначе говоря, компилятор не знает тип объекта, но механизм вызова методов определяет его и вызывает соответствующее тело метода. Механизм позднего связывания зависит от конкретного языка, но нетрудно предположить, что для его реализации в объекты должна включаться какая-то дополнительная информация.

Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как final (приватные методы являются final по умолчанию).

Читать полностью…

Senior Java Developer

В чём разница между «конкуренцией» и «параллелизмом»?

Конкуренция — это способ одновременного решения множества задач.

Признаки:
• Наличие нескольких потоков управления (например, Thread в Java, корутина в Kotlin), если поток управления один, то конкурентного выполнения быть не может
• Недетерминированный результат выполнения. Результат зависит от случайных событий, реализации и того, как была проведена синхронизация. Даже если каждый поток полностью детерминированный, итоговый результат будет недетерминированным

Параллелизм — это способ выполнения разных частей одной задачи.

Признаки:
• Необязательно имеет несколько потоков управления
• Может приводить к детерминированному результату, так, например, результат умножения каждого элемента массива на число, не изменится, если умножать его по частям параллельно.

Читать полностью…

Senior Java Developer

#вопросы_с_собеседований
Stack считается «устаревшим». Чем его рекомендуют заменять? Почему?

Stack был добавлен в Java 1.0 как реализация стека LIFO (last-in-first-out) и является расширением коллекции Vector, хотя это несколько нарушает понятие стека (например, класс Vector предоставляет возможность обращаться к любому элементу по индексу). Является частично синхронизированной коллекцией (кроме метода добавления push()) с вытекающими отсюда последствиями в виде негативного воздействия на производительность. После добавления в Java 1.6 интерфейса Deque, рекомендуется использовать реализации именно этого интерфейса, например, ArrayDeque.

Читать полностью…

Senior Java Developer

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

Об этих и других звуковых искажениях рассказала команда VK Звонков. В статье на Хабре они объяснили, из чего складывается качество звука, какие требования к передаче звука есть у систем видеозвонков, как работать с качеством и разборчивостью голоса в системе для аудио- или видеосвязи, какие методики и алгоритмы измерения качества речи вообще существуют и т.д.

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

Смотреть статью

Читать полностью…
Subscribe to a channel