№ 4931127152 Изучаем Java. По вопросам сотрудничества: @adv_and_pr Канал на бирже: https://telega.in/c/seniorjavist
#вопросы_с_собеседований
Для чего нужен метод hashCode()?
Метод hashCode() необходим для вычисления хэш кода переданного в качестве входного параметра объекта. В Java это целое число, в более широком смысле - битовая строка фиксированной длины, полученная из массива произвольной длины. Этот метод реализован таким образом, что для одного и того же входного объекта, хэш код всегда будет одинаковым. Следует понимать, что в Java множество возможных хэш кодов ограничено типом int, а множество объектов ничем не ограничено. Из-за этого, вполне возможна ситуация, что хэш коды разных объектов могут совпасть:
• если хэш коды разные, то и объекты гарантированно разные;
• если хэш коды равны, то объекты не обязательно равны(могут быть разные).
#вопросы_с_собеседований
В чём разница между «конкуренцией» и «параллелизмом»?Конкуренция
— это способ одновременного решения множества задач.
Признаки:
• Наличие нескольких потоков управления (например, Thread
в Java
, корутина в Kotlin
), если поток управления один, то конкурентного выполнения быть не может
• Недетерминированный результат выполнения. Результат зависит от случайных событий, реализации и того, как была проведена синхронизация. Даже если каждый поток полностью детерминированный, итоговый результат будет недетерминированнымПараллелизм
— это способ выполнения разных частей одной задачи.
Признаки:
• Необязательно имеет несколько потоков управления
• Может приводить к детерминированному результату, так, например, результат умножения каждого элемента массива на число, не изменится, если умножать его по частям параллельно.
#вопросы_с_собеседований
Может ли статический метод быть переопределён или перегружен?
Перегружен - да. Всё работает точно так же, как и с обычными методами - 2 статических метода могут иметь одинаковое имя, если количество их параметров или типов различается.
Переопределён - нет. Выбор вызываемого статического метода происходит при раннем связывании (на этапе компиляции, а не выполнения) и выполняться всегда будет родительский метод, хотя синтаксически переопределение статического метода - это вполне корректная языковая конструкция.
В целом, к статическим полям и методам рекомендуется обращаться через имя класса, а не объект.
«Входить в IT неспеша» или как стать Middle Java Backend разработчиком минуя ступень Junior
Статья о том, как шаг за шагом при дефиците свободного времени обучиться и устроиться на работу сразу Middle Java разработчиком перескочив через Junior ступеньку, основанная на личном опыте, и о том, как мне это помогло, когда сразу после трудоустройства пришлось тянуть проект практически в solo.
Смотреть статью
👩💻 SpELые приложения на Spring
Присоединяйтесь к открытому уроку, узнайте, как динамически выражать и обрабатывать данные в Spring-приложениях.
🗓 21 мая в 19:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Разработчик на Spring Framework».
О чём поговорим:
✔️Разоберем, для чего нужен SpEL.
✔️Рассмотрим, в каких проектах Spring его можно встретить.
Кому будет интересно:
Spring-разработчикам, Java-бэкенд-инженерам, архитекторам ПО, IT-специалистам и студентам, заинтересованным в технологиях Spring.
В результате урока:
Узнаете, для чего нужен SpEL и где его можно применять.
🔗 Ссылка на регистрацию: https://otus.pw/fBo8/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
TreeMap
TreeMap - это класс, который реализует интерфейс Map и представляет отображение, где ключи хранятся в отсортированном порядке. TreeMap
хранит элементы в красно-черном дереве, что обеспечивает быстрый доступ и эффективный поиск элемента по ключу.
Элементы в TreeMap
автоматически сортируются по ключу. Также можно использовать методы get(key)
, remove(key)
и др., чтобы получить, удалить или изменить элементы в TreeMap
.
В этом примере мы создаем TreeMap
, добавляем в нее несколько элементов и выводим все элементы. При запуске программы в консоли вы увидите следующий вывод:
1 - одинЧитать полностью…
2 - два
3 - три
4 - четыре
5 - пять
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
и выводим результат на экран.
Frontend + Летний митап + Суббота = Я.Субботник по разработке интерфейсов 💛
7 июня в Москве Яндекс Go проводит Я.Субботник по разработке интерфейсов. В программе 4 доклада и воркшоп:
👉 Артемий Карпов расскажет, как команда выстраивает взаимодействие между разработкой и тестированием при написании автотестов и улучшении семантики приложения
👉 Миша Колосовский покажет, как сделать статические схемы интерактивными и причем тут SVG
👉 Давид Давыдов объяснит, что мы сделали с серверным API и как пришли к одной строчке кода вместо сотни
👉 Серёжа Алейников поделится опытом портирования нативного BDUI в вебе
На воркшопе участники в командах будут исправлять некорректные интерфейсы, стараясь учесть требования дизайнеров, бэкенд-разработчиков и тестировщиков. Вместе обсудим варианты решений, а коллеги из Яндекса помогут найти самое оптимальное.
Регистрируйтесь и зовите друзей!
Мероприятие бесплатное. Количество мест в офлайне ограничено — пожалуйста, дождитесь нашего подтверждения.
Реклама. ООО «Яндекс.Такси» ИНН 7704340310
Как разобраться в нейросетях раз и навсегда?!
🚀 Хотите понять, как искусственный интеллект может упростить вашу жизнь или вывести ваш бизнес на новый уровень?
🤖 Авторский канал "ИИчко" — место, где ИИ становится доступным, понятным и невероятно полезным для всех, кто интересуется технологиями.
🔍 Что вас ждет:
• Образовательный контент;
• Простые объяснения сложных тем ИИ;
• Инсайты для профессионалов;
• Практические советы;
• Тренды и вдохновение;
Подписывайтесь на "ИИчко" и откройте для себя ИИ с новой стороны!
👉 /channel/+HnGfS-hawx1mM2Fi
Exchanger
Класс Exchanger
в пакете java.util.concurrent
является классом синхронизации. Он облегчает обмен элементами между парой потоков, создавая точку синхронизации. Его работа проста: он просто ждет, пока два отдельных потока вызовут его метод exchange()
. Когда это происходит, он обменивается данными, предоставленными потоками.
В этом примере кода MakeString
создает строку, добавляя к ней символы от A до J, затем он обменивается этой строкой с UseString
при помощи метода exchange()
. UseString
выводит полученную строку и обменивается пустой строкой с MakeString
. Этот процесс повторяется три раза.
В третий раз MakeString
вызывает exchange()
с тайм-аутом в 250 миллисекунд, а UseString
спит 500 миллисекунд перед вызовом exchange()
. Из-за этого возникает исключение TimeoutException
, которое обрабатывается в MakeString
, и выводится сообщение “Timeout Occurred”.
ArrayBlockingQueueArrayBlockingQueue
— это класс в пакете java.util.concurrent
, который представляет собой ограниченную блокирующую очередь, реализованную на основе массива. Он упорядочивает элементы в порядке FIFO (First In First Out).
Попытки поместить элемент в полную очередь приведут к блокировке операции, ровно как и попытки взять элемент из пустой очереди.
Этот класс поддерживает необязательную политику справедливости для упорядочения. По умолчанию оно не гарантируется. Однако очередь, созданная с установленной справедливостью в значение true
, предоставляет доступ к потокам в порядке FIFO. Справедливость обычно снижает пропускную способность, но уменьшает изменчивость.
В этом примере кода класс Producer
добавляет числа от 0 до 4 в очередь с помощью метода put()
. Consumer
берет элементы из очереди с помощью метода take()
и выводит их. Так как емкость очереди равна 2, то после добавления двух элементов в очередь Producer
блокируется, пока Consumer
не возьмет элемент из очереди.
Строки (String)
Строка представляет собой массив символов. При работе со строками важно понимать, что объект String является неизменяемым (immutable).
То есть при любых операциях над строкой, которые изменяют эту строку, фактически будет создаваться новая строка.
Методы, используемые в примере:
- str1 + " " + str2 - конкатенация строк.
- length() - возвращает длину строки.
- toCharArray() - преобразует строку в массив символов.
- toUpperCase() - преобразует все символы строки в верхний регистр.
- toLowerCase() - преобразует все символы строки в нижний регистр.
- contains() - проверяет, содержит ли строка указанную последовательность символов.
#это_база
Аргументы командной строки
Аргументы командной строки - это массив строк, который передается в метод main при запуске программы. Эти аргументы могут быть использованы для передачи информации в программу при ее запуске.
Чтобы запустить код с аргументами командной строки, нужно передать их после имени класса при запуске программы из командной строки. Например:
- java CommandLineArguments arg1 arg2 arg3
Для демонстрации в этом примере мы выводим общее количество аргументов, а затем перебираем их и выводим каждый аргумент по отдельности.
#это_база
Перегрузка методов
Перегрузка методов позволяет создавать несколько методов с одинаковым именем, но с разными параметрами.
Это может быть полезно, когда нужно выполнить похожие действия для разных типов данных или с разным количеством параметров.
В этом примере мы создаем два метода с именем add, но с разными параметрами. Когда мы вызываем метод add в методе main, компилятор автоматически выбирает правильную версию метода на основе типов передаваемых аргументов.
#это_база
Прыжки по массиву
Дан целочисленный массив nums. Изначально вы располагаетесь на первом индексе массива, и каждый элемент массива представляет собой максимальную длину вашего прыжка на этой позиции.
Возвращается true, если вы можете достичь последнего индекса, или false в противном случае.
Алгоритм использует максимальную длину прыжка в каждой позиции, чтобы определить самый дальний индекс, до которого он может добраться. Постоянно обновляя самый дальний индекс, он проверяет, возможно ли достичь последнего индекса, и возвращает соответствующий результат (True или False).
- Если текущий индекс i больше, чем farthest, это означает, что мы не можем продолжить, поэтому мы возвращаем False.
- Если farthest больше или равен последнему индексу, значит, мы достигли конца массива и возвращаем True.
- Если мы завершаем цикл, не достигнув конца массива, мы возвращаем False.
#разбор_кода
#вопросы_с_собеседований
Stack считается «устаревшим». Чем его рекомендуют заменять? Почему?Stack
был добавлен в Java 1.0
как реализация стека LIFO (last-in-first-out)
и является расширением коллекции Vector
, хотя это несколько нарушает понятие стека (например, класс Vector
предоставляет возможность обращаться к любому элементу по индексу). Является частично синхронизированной коллекцией (кроме метода добавления push()
) с вытекающими отсюда последствиями в виде негативного воздействия на производительность. После добавления в Java 1.6
интерфейса Deque
, рекомендуется использовать реализации именно этого интерфейса, например, ArrayDeque
.
#вопросы_с_собеседований
Что такое статическое и динамическое связывание?
Присоединение вызова метода к телу метода называется связыванием. Если связывание проводится компилятором (компоновщиком) перед запуском программы, то оно называется статическим или ранним связыванием (early binding).
В свою очередь, позднее связывание (late binding) - это связывание, проводимое непосредственно во время выполнения программы, в зависимости от типа объекта. Позднее связывание также называют динамическим (dynamic) или связыванием на стадии выполнения (runtime binding). В языках, реализующих позднее связывание, должен существовать механизм определения фактического типа объекта во время работы программы, для вызова подходящего метода. Иначе говоря, компилятор не знает тип объекта, но механизм вызова методов определяет его и вызывает соответствующее тело метода. Механизм позднего связывания зависит от конкретного языка, но нетрудно предположить, что для его реализации в объекты должна включаться какая-то дополнительная информация.
Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как final (приватные методы являются final по умолчанию).
Spring Transactions
Spring Transactions - это механизм, предоставляемый Spring Framework, который позволяет управлять транзакциями в Java-приложениях. Он предоставляет абстракцию уровня транзакций, которая скрывает детали управления транзакциями в низкоуровневых API базы данных, и упрощает создание транзакционных приложений.
В коде на первом изображении мы используем аннотацию @Transactional
для указания того, что метод createUser()
должен выполняться в контексте транзакции. Все операции с базой данных, включая вставку новой записи, будут обернуты в транзакцию.
На втором изображении представлен пример использования первого кода, мы создаем двух пользователей и пытаемся сохранить их в базе данных. Затем мы генерируем исключение RuntimeException
.
В результате выполнения данного кода, изменения в базе данных будут отменены, так как выполнявшиеся операции были выполнены в контексте транзакции, которая была отменена после генерации исключения.
#вопросы_с_собеседований
Каковы особенности многопоточности в Java EE и Spring?
Одной из особенностей многопоточности в Java EE
и Spring
является использование синхронизации и примитивов синхронизации, таких как блокировки и семафоры, для предотвращения конфликтов между потоками.
Ещё одна важная особенность - использование пулов потоков для более эффективного использования ресурсов и увеличение производительности.
Также в Spring
есть возможность использования асинхронных методов, что позволяет не блокировать основной поток выполнения и ускорять обработку запросов.
IoC (Inversion of Control)
Это модель программного проектирования, в которой управление жизненным циклом объекта переходит от самого объекта к внешним компонентам. Например, вместо того, чтобы объект сам создавал свои зависимости, он получает их извне.
В Java IoC
реализуется с помощью DI
(Dependency Injection) - механизма внедрения зависимостей.
В этом примере мы создали объект User
в одном месте нашего приложения, а затем передали его как зависимость в объект UserController
, который в свою очередь воспользовался этой зависимостью для выполнения своей работы. Это и есть пример IoC
и DI
в Java.
Производительность и наблюдаемость бэкенда. Поиск проблем в продакшене
Признак мастерства бэкендера — глубокое понимание своего стека и того, как работает код в продакшене. Недаром во многих бигтех-компаниях принят подход “you build it, you run it”. Хороший программист не только умеет запилить фичи, но и знает, как работает в проде его софт, и может разобраться, почему его сервис тормозит. Для этого нужно знать особенности рантаймов, инфраструктуры и современные подходы к сбору телеметрии.
Приходи на курс — разберёшься в перформансе на уровне кода и инфраструктуры, научишься внедрять наблюдаемость как в бигтех-компаниях, прокачаешься для собеседований в компании, где ждут от разработчиков широкого инженерного мышления.
🌐 В программе курса:
🤩 Архитектура бэкенд-серверов (Golang, Java, PHP и др) и её особенности: модели обработки запросов и параметры конфигурации, влияющих на производительность
🤩 Zero-code instrumentation на разных языках программирования
🤩 Open Telemetry: основы технологии и применение на примере SigNoz
🤩 Суб-real-time телеметрия поверх UDP c PINBA и “промстэком” (Grafana/Prometheus)
🥸 Кто мы: R&D-центр Devhands. Автор курса — Михаил Курмаев, эксперт по сложным распределённым системам. Долгое время строил платформу в Badoo/Bumble, сейчас в Т-банке развивает дата-платформу.
🗓 Старт курса: 3 июня, 4 недели обучения.
Изучить программу и записаться можно здесь.
Ждем вас!
Реклама. ИП Рыбак А.А. ИНН 771407709607 Erid: 2Vtzqx225tQ
ThreadGroupThreadGroup
представляет собой группу потоков. Кроме того, группа потоков может также включать в себя другие группы потоков. Они образуют дерево, в котором каждая группа потоков, кроме начальной, имеет родителя.
Это позволяет удобно управлять несколькими потоками одновременно, например, приостанавливать, возобновлять или прерывать группу потоков одним вызовом метода.
В этом примере мы создаем группу потоков с именем MyGroup и добавляем в нее два потока. Затем мы запускаем эти потоки и выводим информацию о группе с помощью метода list()
.
Результатом работы этого кода будет вывод информации о группе и сообщений от двух запущенных потоков.
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 Data JPASpring Data JPA
— это модуль Spring Data
, который фокусируется на использовании JPA
для хранения данных в реляционной базе данных. Его наиболее привлекательной особенностью является возможность автоматического создания реализаций репозитория во время выполнения из интерфейса репозитория.
В этом примере мы создаем интерфейс UserRepository
, который расширяет JpaRepository
. Это позволяет нам использовать готовые методы для работы с базой данных, такие как save
, findAll
, delete
и т. д. Кроме того, мы добавляем собственный метод findByUsername
, который позволяет нам искать пользователя по его имени пользователя.
Сервис UserService
использует UserRepository
и мы можем использовать этот сервис в нашем контроллере, чтобы обрабатывать запросы от клиента и возвращать данные из базы данных.
Результатом работы этого кода будет возможность поиска пользователя по его имени пользователя в базе данных с помощью метода findByUsername
из репозитория UserRepository
.
👩💻 Открытый урок «Облака и Mongo DB Atlas»
🗓 12 мая в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Разработчик на Spring Framework»
Погружаемся в мир облачных технологий и учимся разворачивать кластер MongoDB бесплатно.
Программа вебинара:
✔️ Облачные технологии: что такое облака, какие бывают уровни (IaaS, PaaS, SaaS) с простыми аналогиями для понимания.
✔️ Практическая демонстрация: как создать кластер MongoDB в Atlas и подключиться к нему.
Вебинар будет полезен:
Разработчикам, начинающим backend-программистам, студентам IT-курсов и всем, кто хочет разобраться в облачных сервисах.
В результате вебинара вы:
Научитесь создавать кластеры MongoDB в облаке.
🔗 Ссылка на регистрацию: https://otus.pw/BH4jg/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
LinkedBlockingQueueLinkedBlockingQueue
— это опционально ограниченная блокирующая очередь, основанная на связанных узлах. Это означает, что LinkedBlockingQueue
может быть ограничена, если указана ее емкость, в противном случае она будет неограниченной.
Эта очередь упорядочивает элементы в порядке FIFO. Новые элементы вставляются в хвост очереди, а операции извлечения из очереди получают элементы из головы очереди.
В этом примере создается LinkedBlockingQueue
с емкостью 2. Затем в очередь добавляются два элемента. После этого пытаемся добавить третий элемент с помощью метода put()
. Так как очередь заполнена, выполнение программы заблокируется на этой строке и не продолжится, пока не освободится место в очереди.
Дан целочисленный массив nums, поверните массив вправо на k шагов.
Метод rotate принимает массив nums и целое число k. Сначала мы проверяем, что k не отрицательное число и не больше длины массива. Затем мы вызываем метод reverse, который переворачивает первую часть массива от начала до конца - k-1.
Метод reverse переворачивает вторую часть массива от конца - k до конца. Наконец, мы вызываем метод reverse, который переворачивает весь массив. Это позволяет нам получить массив, который был повернут на k шагов вправо.
Метод reverse принимает массив nums, индекс начала и индекс конца. Мы меняем местами элементы массива от начала до конца и уменьшаем индекс начала и увеличиваем индекс конца до тех пор, пока они не пересекутся.
#разбор_кода
Поиск максимальной прибыли
Дан целочисленный массив prices, где prices[i] - это цена данной акции на i-й день. В каждый день вы можете принять решение о покупке и/или продаже акции. В любой момент времени вы можете держать не более одной акции. Однако вы можете купить ее и тут же продать в тот же день. Найдите и верните максимальную прибыль, которую вы можете получить.
Метод maxProfit принимает массив цен prices, где prices[i] - это цена акции в i-й день. Алгоритм находит все возможные прибыли путем вычитания цены покупки из цены продажи и добавления их в список priceGain. Затем суммирует все значения в списке priceGain и возвращает итоговую сумму как максимальную прибыль.
#разбор_кода
☄️ Интеграционное тестирование | Spring Boot + Yandex SourceCraft + Amplicode + Docker Compose Starter
В новом видео вы узнаете, как писать интеграционные тесты быстро и эффективно, совмещая сильные стороны нескольких инструментов.
Мы покажем, как использовать генерацию кода от Amplicode учитывающую контекст всего приложения и дополнить её точечной генерацией от Yandex SourceCraft Code Assistant, а также быстро настроить окружение для тестов с помощью не так давно появившегося Docker Compose стартера.
⚡️СМОТРЕТЬ НА YOUTUBE
⚡️СМОТРЕТЬ В VK ВИДЕО
⚡️СМОТРЕТЬ НА RUTUBE
#реклама
О рекламодателе
String.replace()
Метод replace() используется для замены всех вхождений одного символа или подстроки на другой символ или подстроку в исходной строке. Этот метод возвращает новую строку с замененными символами или подстроками.
В этом примере создается строка "Hello, World!" и вызывается метод replace() для замены всех вхождений символа 'l' на символ 'w'. Результат замены сохраняется в новой строке replaced. Затем исходная и измененная строки выводятся.
#это_база