Комбинирование хеш-таблиц
Комбинирование двух хеш-таблиц вручную через цикл очень неэффективно. Вот альтернативное решение этой проблемы, которое вам возможно понравится.
Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера
Смотреть статью
Узнаем размер памяти компьютера
Для получения информации о памяти компьютера в Java можно использовать класс Runtime.
Регистрация на ARCHI.Tech от ВТБ уже стартовала!
Предварительный этап, на котором можно заработать дополнительные баллы, уже стартовал! Включайся в работу прямо сейчас: https://cnrlink.com/architechvtbjavasenior
📅 Расписание хакатона:
🔹 31 мая – начало регистрации
🔹 14 июня – старт предварительного этапа и митап для участников
🔹 28 июня – окончание регистрации, публикация задач хакатона
🔹 29 июня – закрытие приема решений, жюри выбирает финалистов
🔹 30 июня – онлайн-питч лучших проектов и награждение победителей в прямом эфире
Тебя ждет погружение в проекты ВТБ, знакомство с экспертами банка, решение практических задач и прокачка технических навыков!
👉 Попробуй себя в архитектуре — участвуй в ARCHI.Тech от ВТБ: https://cnrlink.com/architechvtbjavasenior
Реклама. БАНК ВТБ (ПАО). ИНН 7702070139. erid: LjN8KSod6
Получи оффер разработчика в YADRO!
Вендор и производитель IT-инфраструктуры, пользовательского и телеком - оборудования YADRO даёт возможность работать удаленно или в одном из классных офисов в Москве, Питере, Нижнем Новгороде, Екатеринбурге или Минске.
Сейчас открыты вакансии в департамент разработки программного обеспечения и флагманского продукта компании YADRO, современного хранилища – TATLIN.UNIFIED.
Ребята разрабатывают на GO и ожидают знания и понимания алгоритмов обработки данных, основных структур работы с данными, и, конечно, желания развиваться, решать задачи, осмысливая их.
Смотри список, выбирай вакансию и отправляй резюме:
• Инженер-программист Go
• Старший инженер-программист С++
• Старший DevOps-инженер
#вопросы_с_собеседований
Что такое сигнатура метода?
Это уникальная строка, которая описывает типы и порядок аргументов, а также возвращаемый тип метода. Сигнатура используется компилятором Java для различения методов с одинаковым именем, но отличающихся по своим параметрам.
#вопросы_с_собеседований
Что такое «фреймворк Fork/Join»?
Фреймворк Fork/Join
, представленный в JDK 7
, - это набор классов и интерфейсов позволяющих использовать преимущества многопроцессорной архитектуры современных компьютеров. Он разработан для выполнения задач, которые можно рекурсивно разбить на маленькие подзадачи, которые можно решать параллельно.
• Этап Fork
: большая задача разделяется на несколько меньших подзадач, которые в свою очередь также разбиваются на меньшие. И так до тех пор, пока задача не становится тривиальной и решаемой последовательным способом.
• Этап Join
: далее (опционально) идёт процесс «свёртки» - решения подзадач некоторым образом объединяются пока не получится решение всей задачи.
Решение всех подзадач (в т.ч. и само разбиение на подзадачи) происходит параллельно.
Для решения некоторых задач этап Join не требуется. Например, для параллельного QuickSort
— массив рекурсивно делится на всё меньшие и меньшие диапазоны, пока не вырождается в тривиальный случай из 1 элемента. Хотя в некотором смысле Join
будет необходим и тут, т.к. всё равно остаётся необходимость дождаться пока не закончится выполнение всех подзадач.
Ещё одно замечательное преимущество этого фреймворка заключается в том, что он использует work-stealing
алгоритм: потоки, которые завершили выполнение собственных подзадач, могут «украсть» подзадачи у других потоков, которые всё ещё заняты.
💯Как сделать код более понятным и надежным с помощью структур данных Clojure?
Узнайте на практическом открытом уроке "Структуры данных Clojure" от OTUS, где мы:
- познакомимся с основными примитивными типами данных и персистентными структурами, которые являются основой функционального программирования не только в Clojure;
- рассмотрим использование transient-структур для повышения производительности;
- поговорим про Structural Sharing и почему неизменяемые структуры тоже могут быть быстрыми.
Полученные знания пригодятся для работы с Clojure и другими функциональными языками программирования!
⏰ Встречаемся 13 июня в 20:00 мск в рамках курса «Clojure Developer». Все участники вебинара получат специальную цену на обучение!
➡️ Регистрируйся прямо сейчас, чтобы не пропустить бесплатный урок: https://otus.pw/eIBy/
Azure Event Hubs и Java – потоковая обработка больших данных
Azure Event Hubs – это большая часть платформы облачных сервисов Microsoft, предоставляющая решение для потоковой обработки больших объемов данных. Сегодня мы кратко рассмотрим, как Java разработчики могут использовать Event Hubs в своих проектах.
Давайте рассмотрим Github репозиторий Microsoft с SDK для работы с Azure Event Hubs на Java.
1. Подключение к Event Hubs: Вы можете использовать EventHubProducerClient для отправки событий и EventHubConsumerClient для получения событий. Вам нужно будет предоставить строку подключения и имя вашего Event Hub.
2. Отправка событий: Метод send позволяет отправить одно событие или пакет событий.
3. Получение событий: Создайте EventProcessorClient для обработки входящих событий. Вам нужно будет реализовать ProcessEvent и ProcessError методы.
Пример кода из репозитория демонстрирует базовые операции с Azure Event Hubs на Java. Он поможет вам понять, как использовать эту технологию в своих проектах.
Более подробную информацию можно найти в официальной документации Microsoft.
Потоковая обработка данных является критически важной для многих предприятий, и Azure Event Hubs предоставляет мощный инструмент для эффективного управления этими данными. Будьте готовы к облачной эре с Azure!
Преобразуем строку в объект
Используем метод Class.forName(). Этот метод принимает параметр className , который является классом, для которого требуется его экземпляр.
Инструментация байт-кода Java
В рамках текущей статьи будет рассказано о способах инструментации байт-кода java или, другим языком, внесения изменений в компилированные файлы java .class. Здесь будут приведены примеры работы с фреймворками Javaassist и ASM и базовое описание байт-кода.
Смотреть статью
#вопросы_с_собеседований
Объясните принципы работы и использование Future и Callable в Java для выполнения асинхронных задач. Приведите пример кода с использованием Future и Callable.
Ответ:
— Callable
: Представляет собой задачу, которую можно выполнить и получить результат.
— Future
: Интерфейс, предназначенный для представления результата асинхронной операции. Он позволяет проверять статус завершения задачи, ожидать завершения и получать результат.
Объяснение:ExecutorService executorService = Executors.newSingleThreadExecutor();
: Создание ExecutorService
с одним потоком.Callable<String> callableTask = ...;
: Создание объекта Callable
, представляющего асинхронную задачу.Future<String> future = executorService.submit(callableTask);
: Подача задачи на выполнение и получение объекта Future
, с помощью которого можно управлять и получать результат асинхронной задачи.String result = future.get();
: Ожидание завершения задачи и получение результата. Если задача еще не завершена, метод get()
будет блокировать текущий поток до завершения задачи.executorService.shutdown();
: Завершение работы ExecutorService после завершения всех задач.
Примечание:
Использование Callable
и Future
полезно в ситуациях, когда вы хотите выполнить асинхронную задачу и получить результат её выполнения. Это может быть полезно в приложениях, где необходимо избегать блокировки главного потока ожиданием завершения долгих операций.
#вопросы_с_собеседований
Расскажите о принципах работы и применении ExecutorService в Java для управления потоками. Приведите пример использования ExecutorService.
Ответ:
ExecutorService — это фреймворк в Java для управления выполнением потоков. Он предоставляет высокоуровневый интерфейс для управления потоками, скрывая детали создания, управления и завершения потоков.
Преимущества:
— Управление пулом потоков.
— Переиспользование потоков.
— Управление жизненным циклом потоков.
Объяснение:Executors.newFixedThreadPool(2)
: Создание пула потоков с фиксированным числом (в данном случае, 2) потоков.executorService.execute(...)
: Подача задач на выполнение. ExecutorService
автоматически управляет потоками из пула для выполнения этих задач.shutdown()
: Вызывается для завершения работы ExecutorService
после завершения всех задач. После вызова shutdown, ExecutorService
больше не принимает новые задачи, но выполняет ранее добавленные.
Примечание:ExecutorService
предоставляет также методы для выполнения задач с возвращаемым значением, планирования задач на определенное время и другие возможности управления потоками. Он является частью более общего фреймворка управления выполнением (Executor framework) в Java.
TimeUnitTimeUnit
— этоперечисление (enum), которое предоставляет удобные константы для работы с временем. Этот класс обычно используется вместе с классом ExecutorService
из пакета java.util.concurrent
для управления временем ожидания выполнения задач.TimeUnit
содержит константы для различных временных единиц, таких как наносекунды, микросекунды, миллисекунды, секунды, минуты и часы. Он предоставляет методы для конвертации времени из одной единицы в другую.
#для_продвинутых
RejectedExecutionHandlerRejectedExecutionHandler
— это интерфейс, используемый для определения стратегии обработки задач, когда они не могут быть приняты для выполнения в пуле потоков. Этот интерфейс содержит единственный метод rejectedExecution
, который вызывается, когда пул потоков не может принять задачу. Разработчики могут предоставить свою реализацию RejectedExecutionHandler
для определения способа обработки отклоненных задач.
#для_продвинутых
📚 Здесь собраны все вопросы, которые могут спросить на собеседовании. Теперь можно легко получить оффер, подготовившись к самым популярным вопросам. Просто выбери своё направление:
1. Frontend / JavaScript
2. Python
3. Java
4. Тестировщик QA
5. Data Science
6. DevOps
7. C#
8. С/C++
9. Golang
10. PHP
11. Kotlin
12. Swift
Пишем Telegram-бота для скачивания видео из VK на Spring Boot и деплоим в Kubernetes
Смотреть статью
Метод Math.ceil()
Метод дает целое число с нулевой дробной частью, ближайшее к числу аргумента справа, другими словами — округляет дробь в большую сторону. Возвращается переменная типа double
.
LibGDX
LibGDX — это кроссплатформенный фреймворк для разработки 2D- и 3D-игр на Java. Он позволяет создавать игры для настольных компьютеров, мобильных устройств, веб-браузеров и даже консолей. LibGDX популярен среди разработчиков игр благодаря своей простоте использования, производительности и большому сообществу.
#для_продвинутых
conductor-oss/conductor
Conductor - это платформа, изначально созданная в Netflix для оркестровки микросервисов и событий, написанный на Java.
Conductor OSS поддерживается командой разработчиков в Orkes вместе с членами сообщества с открытым исходным кодом.git remote set-url origin https://github.com/conductor-oss/conductor
https://github.com/conductor-oss/conductor
Хотите узнать, как работает логистическая платформа в Яндекс Маркете? 🔥
В новом выпуске подкаста I like techno от Яндекса герои обсудили, как устроена платформа сейчас и как она менялась за последние 10 лет.
Команда логистики разрабатывает всё для собственной доставки Маркета: от создания заказа до его перевозки между сортировочными центрами и доставки курьером или в пункт выдачи заказов. Ребята делают код осязаемым, а офлайн технологичным, используют математические структуры, конвейерные системы, собственных роботов и немного магии.
Спикеры — спецы, погруженные в тему:
👉 Слава Цыкин, СТО логистической платформы
👉 Рома Кульчицкий, руководитель службы стабильности и инфраструктуры
👉 Андрей Захрямин, руководитель команды разработки инфраструктуры Логистики
👉 Кирилл Дмитриев, руководитель службы разработки складских систем и систем учёта
Слушать на Яндекс Музыке
Смотреть на Youtube
Дайте определение терминам «простой», «составной» (composite), «потенциальный» (candidate) и «альтернативный» (alternate) ключ.
Простой ключ состоит из одного атрибута (поля). Составной — из двух и более.
Потенциальный ключ - простой или составной ключ, который уникально идентифицирует каждую запись набора данных. При этом потенциальный ключ должен обладать критерием неизбыточности: при удалении любого из полей набор полей перестает уникально идентифицировать запись.
Из множества всех потенциальных ключей набора данных выбирают первичный ключ, все остальные ключи называют альтернативными.
#вопросы_с_собеседований
Что такое «пул потоков»?
Создание потока является затратной по времени и ресурсам операцией. Количество потоков, которое может быть запущено в рамках одного процесса также ограниченно. Чтобы избежать этих проблем и в целом управлять множеством потоков более эффективно в Java
был реализован механизм пула потоков (thread pool
), который создаётся во время запуска приложения и в дальнейшем потоки для обработки запросов берутся и переиспользуются уже из него. Таким образом, появляется возможность не терять потоки, сбалансировать приложение по количеству потоков и частоте их создания.
Начиная с Java 1.5 Java API
предоставляет фреймворк Executor
, который позволяет создавать различные типы пула потоков:
• Executor
- упрощенный интерфейс пула, содержит один метод для передачи задачи на выполнение;
• ExecutorService
- расширенный интерфейс пула, с возможностью завершения всех потоков;
• AbstractExecutorService
- базовый класс пула, реализующий интерфейс ExecutorService
;
• Executors
- фабрика объектов связанных с пулом потоков, в том числе позволяет создать основные типы пулов;
• ThreadPoolExecutor
- пул потоков с гибкой настройкой, может служить базовым классом для нестандартных пулов;
• ForkJoinPool
- пул для выполнения задач типа ForkJoinTask;
... и другие.
Методы Executors
для создания пулов:
• newCachedThreadPool()
- если есть свободный поток, то задача выполняется в нем, иначе добавляется новый поток в пул. Потоки не используемые больше минуты завершаются и удалются и кэша. Размер пула неограничен. Предназначен для выполнения множество небольших асинхронных задач;
• newCachedThreadPool(ThreadFactory threadFactory)
- аналогично предыдущему, но с собственной фабрикой потоков;
• newFixedThreadPool(int nThreads)
- создает пул на указанное число потоков. Если новые задачи добавлены, когда все потоки активны, то они будут сохранены в очереди для выполнения позже. Если один из потоков завершился из-за ошибки, на его место будет запущен другой поток. Потоки живут до тех пор, пока пул не будет закрыт явно методом shutdown()
.
• newFixedThreadPool(int nThreads, ThreadFactory threadFactory)
- аналогично предыдущему, но с собственной фабрикой потоков;
• newSingleThreadScheduledExecutor()
- однопотоковый пул с возможностью выполнять задачу через указанное время или выполнять периодически. Если поток был завершен из-за каких-либо ошибок, то для выполнения следующей задачи будет создан новый поток.
• newSingleThreadScheduledExecutor(ThreadFactory threadFactory)
- аналогично предыдущему, но с собственной фабрикой потоков;
• newScheduledThreadPool(int corePoolSize)
- пул для выполнения задач через указанное время или переодически;
• newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
- аналогично предыдущему, но с собственной фабрикой потоков;
• unconfigurableExecutorService(ExecutorService executor)
- обертка на пул, запрещающая изменять его конфигурацию;
Что представляет собой «обмен сообщениями»?
Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия. В ООП
посылка сообщения (вызов метода) — это единственный путь передать управление объекту. Если объект должен «отвечать» на это сообщение, то у него должна иметься соответствующий данному сообщению метод. Так же объекты, используя свои методы, могут и сами посылать сообщения другим объектам. Обмен сообщениями реализуется с помощью динамических вызовов, что приводит к чрезвычайно позднему связыванию (extreme late binding
).
Пусть требуется создать физическую модель, описывающую сталкивающиеся шары разных размеров. Традиционный подход к решению этой задачи примерно таков: определяется набор данных, описывающих каждый шар (например, его координаты, массу и ускорение); каждому шару присваивается уникальный идентификатор (например, организуется массив, значение индекса которого соответствует номеру шара), который позволит отличать каждый из шаров от всех других. Наконец, пишется подпрограмма с названием, скажем, bounce; эта процедура должна на основе номера шара и его начальных параметров соответствующим образом изменять данные, описывающие шар. В отличие от традиционного подхода объектно-ориентированная версия программы моделирует каждый из шаров посредством объекта. При этом объект, соответствующий конкретному шару, содержит не только его параметры, но и весь код, описывающий поведение шара при различных взаимодействиях. Так, каждый шар будет иметь собственный метод bounce(). Вместо того, чтобы вызывать подпрограмму bounce с аргументом, определяющим, скажем, шар №3, необходимо будет передать объекту «шар №3» сообщение, предписывающее ему выполнить столкновение.
Java-программа для преобразования десятичной системы счисления в двоичную
Воспользуемся побитовыми операторами для решения данной задачи.
Временная сложность: O (1)
Вспомогательное пространство: O (1).
Если бы вы могли сравнить принципы работы Garbage Collector в Java с процессами в живой природе, какой был бы самый подходящий аналог и почему?
Garbage Collector в Java можно сравнить с процессом опадания и разложения листьев в лесу. Так же, как опавшие листья удаляются из экосистемы леса, освобождая место и питательные вещества для новых растений, Garbage Collector удаляет неиспользуемые объекты из памяти, освобождая ресурсы для новых объектов.
#вопросы_с_собеседований
Объясните принципы работы и применение «стримов» (streams) в Java. Какие операции можно выполнять с использованием стримов? Приведите пример кода с использованием стримов.
Ответ:
Стримы представляют собой последовательность элементов, которую можно обрабатывать функциональными операциями. Стримы применяют в фильтрации для выборки элементов, для отображения (Mapping), сортировки и свертки (Reduction).
Объяснение кода:words.stream()
: Создание стрима из списка слов..filter(word -> word.length() > 5)
: Фильтрация слов, оставляя только те, у которых длина больше 5 символов..map(String::toUpperCase)
: Преобразование каждого слова в верхний регистр..sorted()
: Сортировка слов..collect(Collectors.toList())
: Сбор результатов в список.
Результат выводится на экран: [BANANA, ORANGE].
ForkJoinPool.ManagedBlockerForkJoinPool.ManagedBlocker
является интерфейсом в Java, который предоставляет механизм для блокировки потока внутри фреймворка ForkJoinPool
. ForkJoinPool
— это фреймворк параллельного выполнения введенный в Java 7.
Интерфейс ManagedBlocker
предоставляет метод boolean block()
и используется для реализации пользовательских операций, которые могут вызвать блокировку потока. Этот интерфейс обычно используется в ситуациях, когда задача внутри ForkJoinPool
ожидает результат выполнения другой задачи, но не хочет приводить к блокировке потока.
#для_продвинутых
⚡️В сети начали находить курсы и книги известных онлайн школ в открытом доступе
Вот отсортированная база с тонной материала(постепенно пополняется):
🔗 БАЗА (3385 видео):
(343 видео, 87 книги) — Java
(176 видео, 32 книги) — Git
(293 видео, 63 книги) — C#
(352 видео, 89 книги) — С++
(167 видео, 53 книги) — PHP
(227 видео, 83 книги) — SQL
(163 видео, 29 книги) — Linux
(363 видео, 122 книги) — Python
(415 видео, 168 книги) — Frontend
(143 видео, 33 книги) — Flask
(167 видео, 43 книги) — Django
(197 видео, 49 книги) — Разработка ботов
(137 видео, 93 книги) — Data Science
(113 видео, 82 книги) — GameDev
(129 видео, 73 книги) — QA
Скачивать ничего не нужно — все выложили в Telegram и на YouTube с доступом по ссылке