Изучаем Java. По вопросам сотрудничества: @seniorvladislav
Прыжки по массиву
Дан целочисленный массив nums. Изначально вы располагаетесь на первом индексе массива, и каждый элемент массива представляет собой максимальную длину вашего прыжка на этой позиции.
Возвращается true, если вы можете достичь последнего индекса, или false в противном случае.
Алгоритм использует максимальную длину прыжка в каждой позиции, чтобы определить самый дальний индекс, до которого он может добраться. Постоянно обновляя самый дальний индекс, он проверяет, возможно ли достичь последнего индекса, и возвращает соответствующий результат (True или False).
- Если текущий индекс i больше, чем farthest, это означает, что мы не можем продолжить, поэтому мы возвращаем False.
- Если farthest больше или равен последнему индексу, значит, мы достигли конца массива и возвращаем True.
- Если мы завершаем цикл, не достигнув конца массива, мы возвращаем False.
#разбор_кода
ChatGPT теперь в Телеграм!
Откройте для себя умного и быстрого собеседника на основе технологии GPT-4.
- Получайте мгновенные ответы на ваши вопросы.
- Генерируйте изображения по запросу.
- Используйте бота в групповом чате.
- Редактируйте файлы.
Попробуйте бесплатно @GPTNeuralBot
Стать сотрудником Яндекса быстрее и проще, чем кажется. Участвуйте в днях быстрого найма: решите тестовое, пройдите несколько секций собеседования и получите офер за несколько дней.
Ближайшее мероприятие:
• 22-23 июля — Fast Track для Oracle-разработчиков, с опытом работы на PL/SQL или тех, кто готов перейти. Офер за 2 дня в команду HR Tech.
Зарегистрироваться
Дан целочисленный массив nums, поверните массив вправо на k шагов.
Метод rotate принимает массив nums и целое число k. Сначала мы проверяем, что k не отрицательное число и не больше длины массива. Затем мы вызываем метод reverse, который переворачивает первую часть массива от начала до конца - k-1.
Метод reverse переворачивает вторую часть массива от конца - k до конца. Наконец, мы вызываем метод reverse, который переворачивает весь массив. Это позволяет нам получить массив, который был повернут на k шагов вправо.
Метод reverse принимает массив nums, индекс начала и индекс конца. Мы меняем местами элементы массива от начала до конца и уменьшаем индекс начала и увеличиваем индекс конца до тех пор, пока они не пересекутся.
#разбор_кода
Строки (String)
Строка представляет собой массив символов. При работе со строками важно понимать, что объект String является неизменяемым (immutable).
То есть при любых операциях над строкой, которые изменяют эту строку, фактически будет создаваться новая строка.
Методы, используемые в примере:
- str1 + " " + str2 - конкатенация строк.
- length() - возвращает длину строки.
- toCharArray() - преобразует строку в массив символов.
- toUpperCase() - преобразует все символы строки в верхний регистр.
- toLowerCase() - преобразует все символы строки в нижний регистр.
- contains() - проверяет, содержит ли строка указанную последовательность символов.
#это_база
Атомарные переменные в Java.util.concurrent
Пакет java.util.concurrent.atomic
определяет классы, которые поддерживают атомарные операции над отдельными переменными. Все классы имеют методы get
и set
, которые работают как чтение и запись волатильных переменных. То есть set
имеет отношение happens-before с любым последующим get
на той же переменной.
Ниже перечислены все переменные, определенные в пакете: AtomicBoolean
, AtomicInteger
, AtomicLong
, AtomicReference
.
В этом примере создается AtomicInteger
со значением 0. Затем значение инкрементируется с помощью метода incrementAndGet()
. В конце значение получается с помощью метода get()
.
Сравнили лучшие курсы по Java-разработке!
Tutortop — образовательный маркетплейс №1, где представлено свыше 5000 курсов от более чем 300 школ и все их можно сравнить по рейтингу, цене и отзывам, а еще купить дешевле, чем напрямую 🔥
Подборка из топовых курсов для Java-разработчиков от tutortop:
— Профессия «Java-разработчик» от Skypro Рейтинг 4.9 из 5.
— Онлай-курс «Java-разработчик с нуля» от Нетологии. Рейтинг 4.8 из 5.
— Профессия «Java-разработчик с гарантией трудоустройства» от Product Star. Рейтинг 4.8 из 5.
Десятки других курсов по программированию на любом языке можно найти и сравнить на tutortop!⚡️
LinkedBlockingQueueLinkedBlockingQueue
— это опционально ограниченная блокирующая очередь, основанная на связанных узлах. Это означает, что LinkedBlockingQueue
может быть ограничена, если указана ее емкость, в противном случае она будет неограниченной.
Эта очередь упорядочивает элементы в порядке FIFO. Новые элементы вставляются в хвост очереди, а операции извлечения из очереди получают элементы из головы очереди.
В этом примере создается LinkedBlockingQueue
с емкостью 2. Затем в очередь добавляются два элемента. После этого пытаемся добавить третий элемент с помощью метода put()
. Так как очередь заполнена, выполнение программы заблокируется на этой строке и не продолжится, пока не освободится место в очереди.
ArrayBlockingQueueArrayBlockingQueue
— это класс в пакете java.util.concurrent
, который представляет собой ограниченную блокирующую очередь, реализованную на основе массива. Он упорядочивает элементы в порядке FIFO (First In First Out).
Попытки поместить элемент в полную очередь приведут к блокировке операции, ровно как и попытки взять элемент из пустой очереди.
Этот класс поддерживает необязательную политику справедливости для упорядочения. По умолчанию оно не гарантируется. Однако очередь, созданная с установленной справедливостью в значение true
, предоставляет доступ к потокам в порядке FIFO. Справедливость обычно снижает пропускную способность, но уменьшает изменчивость.
В этом примере кода класс Producer
добавляет числа от 0 до 4 в очередь с помощью метода put()
. Consumer
берет элементы из очереди с помощью метода take()
и выводит их. Так как емкость очереди равна 2, то после добавления двух элементов в очередь Producer
блокируется, пока Consumer
не возьмет элемент из очереди.
Spring BatchSpring Batch
предоставляет множество утилитных классов, которые уменьшают необходимость писать пользовательский код. Вместо этого вы можете сосредоточиться на бизнес-логике.
Один из примеров использования Spring Batch
— это импорт данных из CSV-файла, преобразование их с помощью пользовательского кода и сохранение конечных результатов в базе данных.
Для этого можно использовать Spring Boot
в качестве каркаса для приложения, встроенную базу данных H2
, Lombok
и Spring Batch
версии 3.0.7.RELEASE.
Этот код создает класс Product
с полями id
, name
, description
и price
, используя аннотации Lombok
для генерации конструкторов, геттеров и сеттеров. Помимо этого необходимо создать таблицу в базе данных для хранения товаров и подготовить данные для загрузки в базу.
❓Как создавать гибкие тестовые планы для JMeter с использованием Groovy DSL?
Ответ узнаете 11 июля в 20:00 на открытом уроке OTUS. Вебинар приурочен к старту онлайн-курса «Groovy Developer» и проведет его преподаватель Андрей Поляков, старший разработчик в Unlimint.
🔥На уроке мы рассмотрим:
— Что такое DSL и как он применяется при создании тестовых планов.
— Основные компоненты тестового плана JMeter.
— Как формировать тестовый план с помощью Groovy DSL.
После вебинара полный курс можно приобрести в рассрочку.
⚡️Для участия зарегистрируйтесь: https://otus.pw/e4AX/
Реклама. Информация о рекламодателе на сайте www.otus.ru.
Верстаешь?
🔥 Оцени 7 причин пройти наш бесплатный интенсив по Frontend-разработке:
1. Сверстаешь веб-сайт на HTML + CSS;
2. Оживишь страницу с помощью JavaScript;
3. Используешь фронтенд-фреймворк Angular;
4. Подключишь Backend и загрузишь сайт на хостинг;
5. Получишь советы по доработке своего проекта;
6. Добавишь в портфолио 1 качественный проект;
7. Получишь в подарок чек-лист «45 мест для поиска работы».
А главное, ты проведёшь 7 дней в приятной компании Fullstack-разработчика с 10-летним стажем – Романа Чернова.
👉 Проскочить на интенсив бесплатно
Начинаем 11 июля.
📣 Собираем энтузиастов технологической отрасли на регату!
Первое сообщество IT-экспертов в Сочи — IT-Club by Сбер выходит в море.
Мы ищем тех, кто горит идеями, жаждет ими делиться, реализовывать проекты, обмениваться энергиями, получать знания от экспертов индустрии. Возможно, мы ищем тебя!
Ты можешь работать в Сбере, а можешь — нет. Ты можешь жить в Сочи, а можешь приехать только на 15 июля. Нам важно лишь твоё соучастие в нашей идее.
Мы хотим 15 июля собрать единомышленников и с пользой погонять уютной айтишечкой на регатах.
Будет полезно, вкусно, незабываемо и.. бесплатно!
❗️Но есть нюанс. Потребуется предварительная регистрация по ссылке и опыт работы по специализации от 2 лет.
Не можешь 15-го? Следи за новостями в канале: планируем еще🙌
~ ~ ~ Будь на одной волне с нами!
RandomAccessFileRandomAccessFile
— это класс пакета Java IO API, который позволяет перемещаться по файлу, читать из него или писать в него, как вам будет угодно. Он обеспечивает несущественный доступ к файлам и ведет себя как большой массив байтов, хранящихся в файловой системе. Вы можете использовать его для чтения и записи данных в файл.
В этом примере мы создаем экземпляр RandomAccessFile
с режимом rw
, который позволяет нам читать и записывать данные в файл. Затем мы записываем строку "Hello, World!" в файл с помощью метода writeUTF()
. После этого мы перемещаем указатель файла в начало с помощью метода seek(0)
и читаем строку из файла с помощью метода readUTF()
. Наконец, мы выводим прочитанную строку на экран и закрываем файл.
SerializableSerializable
— это маркерный интерфейс, который используется для сериализации объектов. Сериализация — это процесс преобразования объекта в последовательность байтов, которую можно сохранить в файле или передать по сети. Для того чтобы класс можно было сериализовать, он должен реализовывать интерфейс Serializable
.
Классы, реализующие Serializable
, могут быть сериализованы и десериализованы. При сериализации объекта все его поля (включая private
) сохраняются в байтовом потоке. При десериализации объекта байтовый поток считывается и на его основе создается новый объект.
В данном примере создается класс Person
, который реализует интерфейс Serializable
. Создается объект этого класса и сериализуется в файл person.out
. Затем этот же объект десериализуется из файла и выводится информация о нем на экран.
Перегрузка методов
Перегрузка методов позволяет создавать несколько методов с одинаковым именем, но с разными параметрами.
Это может быть полезно, когда нужно выполнить похожие действия для разных типов данных или с разным количеством параметров.
В этом примере мы создаем два метода с именем add, но с разными параметрами. Когда мы вызываем метод add в методе main, компилятор автоматически выбирает правильную версию метода на основе типов передаваемых аргументов.
#это_база
Поиск максимальной прибыли
Дан целочисленный массив prices, где prices[i] - это цена данной акции на i-й день. В каждый день вы можете принять решение о покупке и/или продаже акции. В любой момент времени вы можете держать не более одной акции. Однако вы можете купить ее и тут же продать в тот же день. Найдите и верните максимальную прибыль, которую вы можете получить.
Метод maxProfit принимает массив цен prices, где prices[i] - это цена акции в i-й день. Алгоритм находит все возможные прибыли путем вычитания цены покупки из цены продажи и добавления их в список priceGain. Затем суммирует все значения в списке priceGain и возвращает итоговую сумму как максимальную прибыль.
#разбор_кода
Аргументы командной строки
Аргументы командной строки - это массив строк, который передается в метод main при запуске программы. Эти аргументы могут быть использованы для передачи информации в программу при ее запуске.
Чтобы запустить код с аргументами командной строки, нужно передать их после имени класса при запуске программы из командной строки. Например:
- java CommandLineArguments arg1 arg2 arg3
Для демонстрации в этом примере мы выводим общее количество аргументов, а затем перебираем их и выводим каждый аргумент по отдельности.
#это_база
👨💻 Откройте новые горизонты разработки с Groovy.
Ответьте на 18 вопросов, чтобы проверить достаточно ли ваших навыков, чтобы работать с Groovy на практике и попасть на курс — «Groovy Developer» от OTUS.
На полном курсе вы научитесь применять Groovy-скрипты,
использовать статическую и динамическую типизацию кода, а также использовать средства языка для работы с БД.
👉 Пройти тест —
https://otus.pw/YHNb/
Реклама. Информация о рекламодателе на сайте www.otus.ru.
❓Как пишутся языки программирования?
Узнайте на вебинаре в OTUS. Вебинар приурочен к старту онлайн-курса «Математика для программистов».
🔥На бесплатном вебинаре «Как пишутся языки программирования?» мы:
— рассмотрим, как разрабатываются языки программирования,
— построим LL(1)-анализатор алгоритмического языка программирования,
— обсудим ограничения LL(1)-анализаторов и некоторые приемы работы с LL(1)-грамматиками.
Ведущий — Евгений Тюменцев, опытный директор компании по разработке программного обеспечения.
После вебинара полный курс можно приобрести в том числе в рассрочку.
👉Для участия зарегистрируйтесь: регистрация
Нативная интеграция. Информация о продукте www.otus.ru
SynchronousQueueSynchronousQueue
— это блокирующая очередь, в которой каждая операция вставки должна ждать соответствующей операции удаления другим потоком и наоборот.
В этом примере создается SynchronousQueue
. Затем запускаются два потока: производитель и потребитель. Производитель пытается добавить значение в очередь с помощью метода put()
. Этот метод заблокирует выполнение, пока другой поток не вызовет метод take()
. Когда потребитель вызывает метод take()
, он получает значение из очереди, и выполнение производителя продолжается.
ExecutorServiceExecutorService
— это API
JDK
, который упрощает запуск задач в асинхронном режиме. В общем смысле, ExecutorService
автоматически предоставляет пул потоков и API для назначения задач.
Лучший вариант использования ExecutorService
— это обработка независимых задач, таких как транзакции или запросы по схеме "один поток для одной задачи".
В этом примере создается ExecutorService
с помощью фабричного метода Executors.newSingleThreadExecutor()
. Затем запускается задача с помощью метода submit()
. В конце работы ExecutorService
завершается с помощью метода shutdown()
.
✏️ 13 июля в 19:00 по МСК пройдёт бесплатный вебинар «Spring Security»
Что будет на трансляции:
— Spring Security. Зачем?
— Как подключить к проекту и использовать
— Основные настройки и аннотации
Ведущий: Сергей Полухин, Senior Java Developer, старший разработчик и руководитель разработки на проектах Infobip, Сбера, Evento, суперкассы, основатель PDev Studio.
🚀 Бесплатная регистрация: https://clck.ru/34vKct
Exchanger
Класс Exchanger
в пакете java.util.concurrent
является классом синхронизации. Он облегчает обмен элементами между парой потоков, создавая точку синхронизации. Его работа проста: он просто ждет, пока два отдельных потока вызовут его метод exchange()
. Когда это происходит, он обменивается данными, предоставленными потоками.
В этом примере кода MakeString
создает строку, добавляя к ней символы от A до J, затем он обменивается этой строкой с UseString
при помощи метода exchange()
. UseString
выводит полученную строку и обменивается пустой строкой с MakeString
. Этот процесс повторяется три раза.
В третий раз MakeString
вызывает exchange()
с тайм-аутом в 250 миллисекунд, а UseString
спит 500 миллисекунд перед вызовом exchange()
. Из-за этого возникает исключение TimeoutException
, которое обрабатывается в MakeString
, и выводится сообщение “Timeout Occurred”.
Spring Data JPASpring Data JPA
— это модуль Spring Data
, который фокусируется на использовании JPA
для хранения данных в реляционной базе данных. Его наиболее привлекательной особенностью является возможность автоматического создания реализаций репозитория во время выполнения из интерфейса репозитория.
В этом примере мы создаем интерфейс UserRepository
, который расширяет JpaRepository
. Это позволяет нам использовать готовые методы для работы с базой данных, такие как save
, findAll
, delete
и т. д. Кроме того, мы добавляем собственный метод findByUsername
, который позволяет нам искать пользователя по его имени пользователя.
Сервис UserService
использует UserRepository
и мы можем использовать этот сервис в нашем контроллере, чтобы обрабатывать запросы от клиента и возвращать данные из базы данных.
Результатом работы этого кода будет возможность поиска пользователя по его имени пользователя в базе данных с помощью метода findByUsername
из репозитория UserRepository
.
Spring Web ModuleSpring Web Module
является частью фреймворка Spring
и включает в себя необходимые компоненты для создания веб-приложений, а также имеет встроенный контейнер Apache Tomcat
.
Он может использоваться для создания различных веб-проектов на языке Java.
В этом примере мы создаем класс Application
с аннотацией @SpringBootApplication
, которая указывает на то, что это главный класс приложения Spring Boot
. Мы также добавляем аннотацию @RestController
, чтобы указать, что этот класс является контроллером.
Метод home()
аннотирован как @GetMapping("/")
, что означает, что он обрабатывает HTTP GET запросы к корневому URL-адресу (“/”). Этот метод возвращает строку “Hello World!”.
Результатом работы этого кода будет запуск веб-приложения, которое отображает строку “Hello World!” при обращении к корневому URL-адресу.
Spring Context
Модуль Spring
Context
является частью фреймворка Spring
и представляет собой IoC (Inversion of Control) контейнер. Он отвечает за управление объектами приложения и использует внедрение зависимостей для достижения инверсии управления.
Интерфейсы BeanFactory
и ApplicationContext
представляют контейнер Spring IoC. - BeanFactory
является корневым интерфейсом для доступа к контейнеру Spring
и предоставляет базовые функции для управления бинами.- ApplicationContext
является под интерфейсом BeanFactory
, поэтому он предлагает все функции BeanFactory
, а также предоставляет разрешение сообщений, поддержку интернационализации, публикацию событий и контексты специфические для уровня приложения.
В этом примере мы создаем экземпляр ApplicationContext
, используя AnnotationConfigApplicationContext
и передавая ему класс конфигурации AppConfig
.
Далее получаем бин MyService
, вызывая метод getBean()
.
И наконец, вызываем метод getMessage()
у экземпляра myService
и выводим результат на экран.
ThreadGroupThreadGroup
представляет собой группу потоков. Кроме того, группа потоков может также включать в себя другие группы потоков. Они образуют дерево, в котором каждая группа потоков, кроме начальной, имеет родителя.
Это позволяет удобно управлять несколькими потоками одновременно, например, приостанавливать, возобновлять или прерывать группу потоков одним вызовом метода.
В этом примере мы создаем группу потоков с именем MyGroup и добавляем в нее два потока. Затем мы запускаем эти потоки и выводим информацию о группе с помощью метода list()
.
Результатом работы этого кода будет вывод информации о группе и сообщений от двух запущенных потоков.
Интерфейс FilenameFilterFilenameFilter
— это интерфейс, который используется для фильтрации имен файлов. Он содержит один метод accept(File dir, String name)
, который принимает два параметра: объект типа File
, представляющий каталог, и строку с именем файла. Метод возвращает true
, если имя файла удовлетворяет условиям фильтрации.
Интерфейс FilenameFilter
применяется для фильтрации файлов в директории. Для этого можно использовать методы list()
и listFiles()
класса File
.
В данном примере создается объект типа File
для директории C:\Users\User\Desktop\test
. Создается объект типа FilenameFilter
, который фильтрует файлы по расширению .txt
. Затем получаем список файлов в директории с помощью метода list()
и выводим список файлов на экран.
SortedSet
SortedSet — это интерфейс, который расширяет Set
и описывает упорядоченное множество, отсортированное в возрастающем порядке или по порядку, заданному реализацией интерфейса Comparator
. Он может использоваться для создания коллекций, которые хранят элементы в отсортированном виде.
В этом примере мы создаем объект SortedSet
с использованием класса TreeSet
, который реализует интерфейс NavigableSet
, который поддерживает элементы в отсортированном по возрастанию порядке.
Затем мы добавляем несколько элементов в множество и выводим его на экран.
Обратите внимание, что элементы были добавлены в одном порядке, но при выводе на консоль элементы отображаются в отсортированном порядке.