❓Как пишутся языки программирования?
Узнайте на вебинаре в 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
, который поддерживает элементы в отсортированном по возрастанию порядке.
Затем мы добавляем несколько элементов в множество и выводим его на экран.
Обратите внимание, что элементы были добавлены в одном порядке, но при выводе на консоль элементы отображаются в отсортированном порядке.
Аннотация Entity
Аннотация Entity используется для обозначения класса как entity-класса в Java Persistence API
(JPA). Entity-класс представляет собой объект, который может быть сохранен в базе данных.
Обычно entity-класс представляет таблицу в базе данных, а каждый экземпляр entity-класса представляет строку в этой таблице.
В этом примере мы определяем entity-класс Student
, который представляет студента, а также используем аннотации Id
и GeneratedValue
для определения первичного ключа этого класса.
Этот класс имеет три поля: id
, name
и age
, которые представляют идентификатор, имя и возраст студента соответственно. Затем определяем конструктор без аргументов (так как он требуется JPA) и конструктор с аргументами для удобства создания экземпляров этого класса.
После определения этого класса мы можем использовать его для сохранения и извлечения данных о студентах из базы данных с помощью JPA.
👨💻 Хотите освоить лучшие инструменты по разработке микросервисной архитектуры?
Ответьте на 11 вопросов, чтобы проверить достаточно ли ваших навыков, чтобы строить архитектуру микросервисов и попасть на курс — «Microservice Architecture» от OTUS.
На полном курсе вы научитесь проектировать сложный бэкенд и работать с легаси-проектами, разбираться с трудными ситуациями и находить нестандартные решения. Все это на практике, с реальными кейсами и под руководством команды экспертов!
👉 Пройти тест — https://otus.pw/F4YQ/
💣 После прохождения у вас будет возможность записаться на курс по спец. цене и оформить рассрочку. А также вы получите доступ к записям 27 открытых уроков курса.
Реклама. Информация о рекламодателе на сайте www.otus.ru.
#вопросы_с_собеседований
Что такое каскадность? Как она используется в Hibernate?
Каскадность в Hibernate — это функция, которая позволяет автоматически распространять состояние сущности на связанные с ней сущности. Это означает, что когда мы выполняем определенное действие над целевой сущностью, то же самое действие будет применено к связанным с ней сущностям.
Например, если у нас есть отношение между сущностями Person и Address, и без сущности Person сущность Address не имеет смысла. Когда мы удаляем сущность Person, наша сущность Address также должна быть удалена. Каскадность - это способ достижения этого.
В JPA/Hibernate имеются различные типы каскадности, которые определяют, какие операции должны распространяться на связанные сущности. Например, CascadeType.ALL распространяет все операции от родительской сущности на дочернюю.
Получаем порядковый номер элемента в enum
Метод ordinal()
используется с перечислениями (enum
). Он возвращает порядковый номер константы перечисления, начиная с нуля.
В этом примере создается перечисление Colours
с четырьмя константами: Red
, Green
, Brown
и Yellow
. В методе main
создаются переменные для каждой из этих констант и выводятся их порядковые номера с помощью метода ordinal()
.
Атомарные переменные в 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
. Затем этот же объект десериализуется из файла и выводится информация о нем на экран.
#вопросы_с_собеседований
В чем разница между интерфейсами Comparable и Comparator?
Основное различие между интерфейсами Comparable
и Comparator
заключается в том, что в Comparable
"зашит" один-единственный алгоритм сравнения объектов, в то время как Comparator
представляет собой внешнюю заменяемую настройку. Архитектурно, Comparable
- это интерфейс значения, в то время как Comparator
- настройка контейнера.
Следует использовать Comparable
, когда задается естественный (наиболее логичный) порядок. Например, для строк это регистрозависимое лексикографическое сравнение, а для длинных чисел - сравнение по значению. Во всех остальных случаях - без отдельного компаратора не обойтись.
newSingleThreadExecutor()
Метод newSingleThreadExecutor()
класса Executors создает исполнитель, который использует единственный рабочий поток, работающий с неограниченной очередью. Задачи гарантированно выполняются последовательно и в том порядке, в котором они были добавлены.
Этот метод может быть полезен, когда требуется выполнение задач в строго определенном порядке, но при этом хочется избежать явного управления жизненным циклом потоков.
В этом примере мы создаем исполнителя с помощью метода newSingleThreadExecutor()
и добавляем три задачи с помощью метода submit()
. Затем мы вызываем метод shutdown()
для завершения работы исполнителя.
Класс "обертка" (wrapper class)
Класс-обертка (wrapper class) — это класс, который обеспечивает возможность использования примитивных типов данных как объектов. Каждый примитивный тип данных в Java имеет соответствующий класс-обертку: byte
- Byte
, short
- Short
, int
- Integer
, long
- Long
, float
- Float
, double
- Double
, boolean
- Boolean
и char
- Character
.
Классы-обертки используются, например, при работе с объектами коллекций, такими как ArrayList
, где примитивные типы не могут быть использованы (список может хранить только объекты).
В этом примере мы создаем объекты классов-оберток для примитивных типов int
, double
, char
и выводим значения этих объектов с помощью метода println()
.
🔥 Готовы проникнуться волшебством алгоритмов?
📆 3 июля в 20:00 мск на открытом уроке у вас будет возможность познакомиться с настоящим маленьким чудом — алгоритмом поиска подстроки в строке Кнута-Морриса-Пратта.
🎥 Вебинар приурочен к старту онлайн-курса «Алгоритмы и структуры данных» в OTUS, и проведет его Евгений Волосатов, опытный программист.
🔵Автомат Кнута-Морриса-Пратта — это маленький, но очень непростой для понимания алгоритм, поэтому, чтобы в нём разобраться мы сначала построим конечный автомат для поиска шаблона, а потом оптимизируем его: заменим двумерную матрицу перехода префиксным Пи-вектором и узнаем, как решить эту задачу за линейное время.
🔵У вас будет возможность познакомиться с преподавателем, задать вопросы и узнать, как проходит обучение в OTUS.
А полный курс вы сможете приобрести в рассрочку.
👉 Зарегистрируйтесь на встречу: https://otus.pw/1OWk/ Нативная интеграция. Информация о продукте www.otus.ru
Попади в команду Дзена всего за два дня!
8-9 июля Дзен приглашает backend-разработчиков на Hiring Days. Сейчас ребята ищут коллег в команды инфраструктуры и продуктовой разработки, нужен опыт от двух лет и готовность работать с высоконагруженным сервисом, в который приходит до 150 тысяч запросов в секунду и от 30 миллионов пользователей каждый день.
На Hiring Days всё как обычно, но без контестов и долгих ответов: вы оставляете заявку, с вами связываются организаторы — и, если всё хорошо, зовут на секции и высылают оффер за выходные.
Регистрация открыта до 5 июля. И да, всё онлайн!