One Weekend Offer для Java-разработчиков 👨💻
Если вы — Java-разработчик уровня Middle/Senior/Lead с опытом работы от 3 лет, то присоединяйтесь к команде Сбера!
31 августа – 1 сентября вы сможете пройти все этапы отбора, познакомиться с будущей командой и получить заветный оффер. Какие задачи будут в вашем планере?
▫️ Проводить декомпозицию и оценку задач.
▫️ Работать в тесной связке с аналитиками и разработчиками front-end.
▫️ Выполнять code review.
▫️ Проектировать архитектуру приложения.
Наша команда разрабатывает высоконагруженные сервисы с использованием Cloud Native подхода к созданию, развёртыванию и управлению современными приложениями в средах облачных вычислений.
Откликайтесь, и увидимся на выходных! 😉
PriorityQueue
В Java можно использовать класс PriorityQueue
для реализации приоритетной очереди. PriorityQueue
предоставляет мин-кучу (min-heap), что означает, что на вершине всегда находится элемент с наименьшим значением при их извлечении. Если вам нужна макс-куча (max-heap), вы можете использовать класс Collections.reverseOrder()
для изменения порядка сравнения элементов.
Обратите внимание, что приоритетная очередь автоматически упорядочивает элементы при добавлении и предоставляет эффективное извлечение элемента с наименьшим приоритетом. Однако, если вам нужна более сложная логика сравнения элементов, вы можете использовать собственный компаратор при создании PriorityQueue
.
#для_продвинутых
Класс Assert
Класс Assert предоставляет удобные методы для проверки условий во время выполнения программы. Он позволяет программистам добавлять проверки, которые помогают выявлять ошибки и неправильное поведение в программе на ранних этапах разработки. Когда условие не выполняется (ложно), Assert генерирует исключение AssertionError, чтобы предупредить разработчика о проблеме.
#для_продвинутых
Trie
Trie (или префиксное дерево) — это древовидная структура данных, предназначенная для эффективного хранения множества строк, где ключи представляют собой последовательности символов. Trie предоставляет эффективный способ поиска, вставки и удаления строк. Он основан на представлении ассоциативного массива, где ключом является строка.
Основные компоненты Trie:
Узел Trie (Trie Node): Каждый узел содержит ссылки на дочерние узлы, представляющие следующие символы в строке, а также флаг, указывающий, является ли этот узел концом строки.
Корень Trie (Trie Root): Вершина дерева, которая не содержит символ, но имеет ссылки на дочерние узлы, представляющие все возможные первые символы строк.
Операции Trie:
Вставка (Insertion): Для вставки строки в Trie, мы начинаем с корня и последовательно добавляем узлы для каждого символа строки. При этом, если узел уже существует для данного символа, мы просто переходим к следующему узлу. Последний узел строки помечается как конец строки.
Поиск (Search): Поиск строки в Trie осуществляется путем последовательного перехода от корня к листу, используя символы строки в качестве направляющих индикаторов. Если в какой-то момент мы достигаем узла, у которого нет соответствующего символа или строки, то строка отсутствует в Trie.
Поиск по префиксу (Prefix Search): Эта операция позволяет определить, существует ли какая-либо строка, начинающаяся с заданного префикса. Мы просто выполняем поиск, не обязательно дойдя до конца строки.
#для_продвинутых
Collections.shuffleCollections.shuffle
— это метод в библиотеке Java, который перемешивает элементы коллекции в случайном порядке. Этот метод принимает на вход коллекцию и использует генератор случайных чисел для перемешивания элементов.
В примере на картинке создается список чисел от 1 до 10, затем вызывается Collections.shuffle
(numbers), чтобы перемешать элементы списка. После этого выводится результат.
Обратите внимание, что shuffle
изменяет переданную коллекцию, а не создает новую. Если вам нужно сохранить оригинальный порядок элементов, создайте копию коллекции перед вызовом метода shuffle
.
#для_начинающих
Single Responsibility Principle
Принцип единственной ответственности (Single Responsibility Principle, SRP) является одним из принципов SOLID, предложенных Робертом Мартином. Этот принцип гласит, что у класса должна быть только одна причина для изменения. Иными словами, класс должен выполнять только одну ответственность.
Применительно к Java это означает, что класс должен быть спроектирован так, чтобы он занимался только одним аспектом функциональности. Если у класса есть более одной обязанности, его стоит разделить на несколько классов, каждый из которых будет отвечать за свою конкретную обязанность.
#для_продвинутых
➡️ Отправка email с использованием JavaMail API
Метод postMail
отправляет письмо на заданные адреса. Он принимает список получателей, тему, сообщение и адрес отправителя.
⚙️ Настраивается соединение с SMTP-сервером, создается сессия и сообщение. Устанавливаются адрес отправителя и получателей, заголовки, тема и текст сообщения.
✔️ Затем сообщение отправляется с помощью метода Transport.send
.
➡️ Скриншот в Java
🗣️ Этот код выполняет захват экрана и сохраняет его как изображение в формате PNG.
•
Получает размер экрана с помощью Toolkit.getDefaultToolkit().getScreenSize()
.•
Создает прямоугольник, соответствующий размеру экрана.•
Создает объект Robot
для выполнения действий, связанных с автоматизацией, таких как захват экрана.•
Захватывает изображение экрана в виде объекта BufferedImage
.•
Сохраняет захваченное изображение в файл с указанным именем и форматом PNG с помощью ImageIO.write()
.
Читать полностью…
Бэкенд-разработчики, вышла новая версия CodeRun с задачами от разработчиков Яндекса и внешних экспертов
CodeRun — бесплатный онлайн-тренажер с кастомизацией сложности и большим каталогом задач. Здесь можно готовиться к техническим собеседованиям по программированию и заполнять пробелы в знаниях. А еще решать тематические и авторские подборки и задания с прошлых турниров и контестов.
Главная особенность: здесь есть система рейтинга и баллов, а также сезонные турниры. По итогам каждого сезона лучшие кодеры могут получить мерч, сертификаты и даже возможность попасть в штат Яндекса по упрощенному найму.
2 сезон уже начался: решайте задачи и зарабатывайте баллы на ценные призы.
😮 Добавлена новая база слитых курсов на 800ГБ:
Python:
/channel/+OnAzdnf-1mRjNjYy
Программирование:
/channel/+V2R5VLsH2igwMmU6
Frontend и Web:
/channel/+baoGxh-bG4Q5NmNi
Графика и дизайн:
/channel/+GrDwDo7c96s5ZTIy
#вопросы_с_собеседований
Каким образом из вложенного класса получить доступ к полю внешнего класса?
Статический вложенный класс имеет прямой доступ только к статическим полям обрамляющего класса.
Простой внутренний класс, может обратиться к любому полю внешнего класса напрямую. В случае, если у вложенного класса уже существует поле с таким же литералом, то обращаться к такому полю следует через ссылку на его экземпляр. Например: Outer.this.field.
Начните обучение в магистратуре в Центральном университете уже на 3-м курсе бакалавриата!
Центральный университет — современный вуз, созданный при поддержке ведущих компаний России: Т-Банка, Авито и других.
Учебу реально совместить с последними курсами бакалавриата или действующей работой. Обучение занимает 20 часов в неделю в вечернее время в первый год, а занятия проводят в центре Москвы профессоры из МГУ, МФТИ, РЭШ и практики из индустрии. Обучение в университете построено по принципам ИТ-компаний, со средой, способствующей росту и развитию.
У каждого студента будет:
— личный ментор по траектории обучения;
— доступ к карьерному центру с коучами и консультантами;
— опыт работы в проектах 30+ компаний-партнеров уже во время обучения;
— диплом гособразца.
Участвуйте в онлайн-отборе, чтобы выиграть грант на обучение до 1,2 млн рублей. Больше подробностей про университет и конкурс грантов по ссылке!
erid:2VtzqxfHdBZ
Реклама, АНО ВО «Центральный университет», ИНН 774341802
Правила переопределения метода Object.equals().
1. Использование оператора ==
для проверки, является ли аргумент ссылкой на указанный объект. Если является, возвращается true
. Если сравниваемый объект == null
, должно вернуться false
.
2. Использование оператор instanceof
и вызова метода getClass()
для проверки, имеет ли аргумент правильный тип. Если не имеет, возвращается false
.
3. Приведение аргумента к правильному типу. Поскольку эта операция следует за проверкой instanceof
она гарантированно будет выполнена.
4. Обход всех значимых полей класса и проверка того, что значение поля в текущем объекте и значение того же поля в проверяемом на эквивалентность аргументе соответствуют друг другу. Если проверки для всех полей прошли успешно, возвращается результат true
, в противном случае - false
.
По окончанию переопределения метода equals()
следует проверить: является ли порождаемое отношение эквивалентности рефлексивным, симметричным, транзитивным и непротиворечивым? Если ответ отрицательный, метод подлежит соответствующей правке.
Определить и найти. Разработка алгоритма поиска изменений с Мap-ами и хешами
Смотреть статью
ExecutorServiceExecutorService
— это API
JDK
, который упрощает запуск задач в асинхронном режиме. В общем смысле, ExecutorService
автоматически предоставляет пул потоков и API для назначения задач.
Лучший вариант использования ExecutorService
— это обработка независимых задач, таких как транзакции или запросы по схеме "один поток для одной задачи".
В этом примере создается ExecutorService
с помощью фабричного метода Executors.newSingleThreadExecutor()
. Затем запускается задача с помощью метода submit()
. В конце работы ExecutorService
завершается с помощью метода shutdown()
.
Метод split
Метод split() используется для разбиения строки на подстроки по заданному разделителю. Он принимает один параметр — регулярное выражение, по которому будет производиться разбиение строки и возвращает массив строк (String[]), содержащий подстроки.
Если в качестве разделителя передать пробел (" "), то строка разбивается по пробелам на отдельные слова. Также можно указать число в качестве второго параметра, это будет лимит количества элементов.
#это_база
Поднимаем Кафку, не опуская рук. Отказоустойчивый кластер на вашем ПК
22 августа приглашаем вас на вебинар от Слёрма с Василием Калугиным, владельцем корпоративного сервиса Apache Kafka в АО «ЭР-Телеком Холдинг», чтобы поговорить про Кафку и научиться разворачивать кластер на своём железе.
На вебинаре:
🥹 Расскажем про язык Кафки: топики, партиции, продюсеры-консьюмеры, кластер, ноды.
🥹 Рассмотрим принципы её работы: как работают очереди сообщений, сколько должно быть консьюмеров для эффективной вычитки, как повысить надёжность кластера с помощью репликации данных.
🥹 И покажем, как развернуть кластер Кафки на своём ПК с 3 нодами, schema-registry и авторизацией.
Обычно в инструкциях кластер из 1 ноды, зукипера и 1 брокера, но это не наш путь. Учим работать с реальными исходными данными, а не на теоретических примерах 😉
😢И наш традиционный розыгрыш — один из участников вебинара получит бесплатное место на курс «Apache Kafka для разработчиков».
🫣22 августа в 14:00 мск
🫣Регистрация — по ссылке
Реклама ООО «Слёрм» ИНН 3652901451
service() service()
является частью жизненного цикла сервлета. Сервлеты в Java используются для создания динамических веб-приложений. Когда запрос поступает от клиента (например, браузера) к веб-приложению, сервлет обрабатывает этот запрос.
Метод service()
вызывается контейнером сервлетов (например, сервером приложений) для обработки запроса. Контейнер передает объекты ServletRequest
и ServletResponse
в метод service()
. Разработчик сервлета должен реализовать этот метод, чтобы обработать запрос и сгенерировать ответ.
Обычно, разработчики переопределяют метод doGet()
или doPost()
вместо service()
, в зависимости от того, какой тип HTTP-запроса они хотят обрабатывать. Метод service()
в своей реализации делегирует вызовы соответствующим методам обработки запросов (doGet()
, doPost()
, и так далее).
#для_продвинутых
PipedOutputStreamPipedOutputStream
представляет собой выходной поток данных, который можно использовать для записи байтовых данных. Однако его особенность заключается в том, что он предназначен для использования в связке с PipedInputStream
, обеспечивая таким образом межпоточное взаимодействие. Когда данные записываются в PipedOutputStream
, они становятся доступными для чтения из соответствующего PipedInputStream
.
#для_продвинутых
PhaserPhaser
очень похож на более известную CountDownLatch
. Однако он предоставляет некоторые дополнительные функции. Он позволяет нам установить динамическое количество потоков, которые должны ждать перед продолжением выполнения.
С Phaser
определенное количество потоков должно дождаться барьера, прежде чем перейти к следующей фазе выполнения. Благодаря этому мы можем координировать несколько фаз выполнения.
#для_продвинутых
➡️ Пример Singleton в Java
🗣️ Этот код демонстрирует две реализации паттерна Singleton в Java, который гарантирует, что класс имеет только один экземпляр и предоставляет глобальную точку доступа к этому экземпляру.
•
В первой реализации используется класс с приватным конструктором и статическим методом для получения единственного экземпляра.•
Во второй реализации используется перечисление (enum), что обеспечивает автоматическую гарантию единственного экземпляра и потокобезопасность.
Читать полностью…
❕ Есть одна штука, которая мешает развивать продукт и внедрять новые функции.
Это устаревший легаси-монолит.
Поэтому архитектуру легаси-системы нужно обновлять. Однако процесс обновления часто влечёт за собой простои, баги и системные отказы.
Так как же всего этого избежать?
Поговорим на открытом вебинаре «Как обновить легаси-монолит и не поседеть?»
На встрече выступит Алексей Ягур, действующий тимлид с большим опытом программирования в ведущих компаниях.
⌨️Вы узнаете:
- Как проводить аудит существующей системы и планировать миграцию
- О различных подходах к обновлению легаси-монолитов
- Об актуальных инструментах и методиках, которые упрощают процесс миграции
- О том, как снизить риски при переходе на новую архитектуру
👍Бонус! Всем участникам – скидка 5% на любой курс OTUS и бесплатный чек лист по переходу от монолита к микросервисам
13 августа
19:00 МСК
Бесплатно
✅ Записаться на событиеРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
➡️ Создаем PDF-файл в Java
Этот код создает PDF-файл с использованием библиотеки iText в Java.•
Внутри метода main
создается новый PDF-документ, добавляются два параграфа: один с текстом "Hello Kiran
" и второй с текущей датой и временем.•
Затем документ сохраняется в файл C:\Test.pdf
. Если возникает ошибка, она выводится в консоль.
⚙️ Преобразование java.util.Date в java.sql.Date
Этот код преобразует дату из формата Java java.util.Date
в формат java.sql.Date
, который используется для работы с базами данных.
#вопросы_с_собеседований
Какие преобразования называются нисходящими и восходящими?
Восходящее преобразование (Upcasting) — это преобразование объекта дочернего класса в объект родительского класса. Преобразование может быть выполнено неявно, так как дочерний класс является подтипом родительского класса. Восходящее преобразование позволяет нам получить доступ к членам родительского класса, но не ко всем членам дочернего класса.
Нисходящее преобразование (Downcasting) — это преобразование объекта родительского класса в объект дочернего класса. Это преобразование не может быть выполнено неявно и требует явного указания типа. Нисходящее преобразование может быть опасным, так как оно может привести к ошибке ClassCastException, если типы не совместимы.
Как разбить строку на подстроки по заданному разделителю?
Мы можем использовать метод split(String regex) для разделения строки на массив символов, используя в качестве разделителя регулярное выражение.
Метод split(String regex, int numOfStrings) является перегруженным методом для разделения строки на заданное количество строк. Мы можем использовать обратную черту для использования специальных символов регулярных выражений в качестве обычных символов.
⚡️Шпаргалка по Maven
Maven — один из самых популярных и удобных инструментов для управления и сборки проектов на Java. Сохраняй и делись с друзьями!
Что делать, когда уже выучил Java Core, но его не хватает для трудоустройства?
С ростом конкуренции на рынке труда становится все сложнее выделиться среди других ИТ-специалистов и получить оффер. К тому же большинство работодателей ожидают от кандидатов владения масштабным стеком технологий.
Комплексная программа «Java-разработчик. Middle Developer» в гибридном формате с упором на практику с экспертом поможет превратить ваши навыки Java в профессиональное мастерство!
В рамках обучения вы будете работать над реальными проектами и сможете получить ценный практический опыт в области разработки.
✅ Старт курса — август 2024 г. Набор уже идет!
✅ Рассрочка без %. Онлайн-формат.
✅ Удобное расписание.
Начните с бесплатного мини-курса, чтобы понять подойдет вам обучение или нет.
RandomAccessFileRandomAccessFile
— это класс пакета Java IO API, который позволяет перемещаться по файлу, читать из него или писать в него, как вам будет угодно. Он обеспечивает несущественный доступ к файлам и ведет себя как большой массив байтов, хранящихся в файловой системе. Вы можете использовать его для чтения и записи данных в файл.
В этом примере мы создаем экземпляр RandomAccessFile
с режимом rw
, который позволяет нам читать и записывать данные в файл. Затем мы записываем строку "Hello, World!" в файл с помощью метода writeUTF()
. После этого мы перемещаем указатель файла в начало с помощью метода seek(0)
и читаем строку из файла с помощью метода readUTF()
. Наконец, мы выводим прочитанную строку на экран и закрываем файл.
ThreadDeathThreadDeath
представляет собой исключение, которое указывает на то, что поток должен быть остановлен. Это исключение является подклассом Error
, а не Exception
, потому что оно является нормальным явлением и не должно обрабатываться в коде приложения.
Когда поток получает исключение ThreadDeath
, он немедленно завершается. Если поток был заблокирован на мониторе, он сначала разблокирует монитор.
Важно отметить, что исключение ThreadDeath
не может быть обработано с помощью блока try-catch
. Если поток получает исключение ThreadDeath
, оно просто игнорируется и поток завершается.
#для_продвинутых